我有一个包含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的行同名的其他行
任何帮助都会很棒
答案 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指出的字符串,则使用他提供的答案。