熊猫-删除包含Nan的行,然后删除任何关联的行

时间:2018-07-24 12:15:08

标签: python pandas

我有一个包含2列的数据框:“年龄”和“名称”。看起来像这样(在记事本中打开时):

,age,name
0,18,Bill
1,22,Harry
2,Nan,Bill
4,5,William

(第一列是索引)

我需要删除在age列中带有Nan的任何行,并且还删除在name列中具有相同名称的任何行。例如,在我的数据框的代码段中,我想使用Bill插入两行,因为其中一个年龄段包含Nan。

目前我有这个:

df_no_dups = dp[dp.isfinite(dp['age'])]

这是第一部分,但停留在删除与包含Nan的行同名的其他行

任何帮助都会很棒

3 个答案:

答案 0 :(得分:3)

通过boolean indexing过滤,并使用transform创建的布尔掩码来测试每个组的all值是否没有缺失值:

df1 = df[df['age'].notnull().groupby(df['name']).transform('all')]

或者检查缺失值,测试每组至少一个True,最后通过~反转布尔掩码:

df1 = df[~df['age'].isnull().groupby(df['name']).transform('any')]

print (df1)
    age     name
1  22.0    Harry
3   5.0  William

详细信息

print (df['age'].notnull())
0     True
1     True
2    False
3     True
Name: age, dtype: bool

print (df['age'].notnull().groupby(df['name']).transform('all'))
0    False
1     True
2    False
3     True
Name: age, dtype: bool

答案 1 :(得分:1)

尝试一下

df=df.drop_duplicates(subset=['name'],keep=False)
df[(df['age'].notnull()] #or df[(df['age']!='Nan')] (as your input Contains Nan as string)

说明:

首先删除重复项,然后传递keep=False删除所有重复项。然后过滤掉NaN。

输出:

  age     name
1  22    Harry
4   5  William

答案 2 :(得分:1)

这对我有用:

import pandas as pd

df = pd.read_excel('test.xlsx')
df = df.drop_duplicates(subset='name', keep=False)
df = df.dropna(subset=['age'])

编辑:这适用于空值,如果Nan是@Mohamed指出的字符串,则使用他提供的答案。

相关问题