我有一个数据帧,例如:
A B C D E F G
0 9 34 1 1 Nan 9 3
1 Nan 34 0 9 Nan 0 2
2 0 8 Nan 3 9 11 0
3 0 8 15 3 9 11 0
4 Nan 6 1 3 Nan 2 3
5 1 6 1 3 44 2 3我想检查哪些行在B、D和G列中有重复值。如您所见,第2行和第3行有重复值,第4行和第5行也有重复值。我必须删除重复的行,但我想删除具有NAN值的行(2和4)。
我尝试过df.dropna()方法,但它只有几个选项
keep = 'last',
keep = 'first' or
keep='False', 这些都不能解决我的问题。
我的预期输出是
A B C D E F G
0 9 34 1 1 Nan 9 3
1 Nan 34 0 9 Nan 0 2
3 0 8 15 3 9 11 0
5 1 6 1 3 44 2 3我该怎么做呢?谢谢
发布于 2019-01-22 01:45:35
我不是pandas专家,但这里有一种方法可以实现这一点:
subset = df[['B', 'D', 'G']]
to_keep = df[~subset.duplicated(keep=False)]
A B C D E F G
0 9 34 1 1 NaN 9 3
1 NaN 34 0 9 NaN 0 2
to_keep.append(df[subset.duplicated(keep=False)].dropna(), ignore_index=True)
A B C D E F G
0 9 34 1 1 NaN 9 3
1 NaN 34 0 9 NaN 0 2
2 0 8 15 3 9 11 0
3 1 6 1 3 44 2 3如果希望保持索引不变,请删除ignore_index标志
发布于 2019-01-22 01:48:04
您可以按行计算空值,按此数字排序,然后使用drop_duplicates
df['null_count'] = df.isnull().sum(1)
df = df.sort_values('null_count')\
.drop_duplicates(['B', 'D', 'G'])\
.sort_index()
print(df)
A B C D E F G null_count
0 9.0 34.0 1.0 1.0 NaN 9.0 3.0 1
1 NaN 34.0 0.0 9.0 NaN 0.0 2.0 2
3 0.0 8.0 15.0 3.0 9.0 11.0 0.0 0
5 1.0 6.0 1.0 3.0 44.0 2.0 3.0 0如果您希望避免帮助器列,则可以使用以下替代方法:
df = df.iloc[df.isnull().sum(1).values.argsort()]\
.drop_duplicates(['B', 'D', 'G'])\
.sort_index()发布于 2019-01-22 01:59:07
可以将groupby与first一起使用,它将返回first的非空值
df.groupby(['B', 'D', 'G'], as_index = False, sort = False).first().reindex(columns = df.columns)
A B C D E F G
0 9.0 34 1.0 1 NaN 9 3
1 NaN 34 0.0 9 NaN 0 2
2 0.0 8 15.0 3 9.0 11 0
3 1.0 6 1.0 3 44.0 2 3https://stackoverflow.com/questions/54295108
复制相似问题