我有一个数据框,例如:
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
我该怎么办? 谢谢
答案 0 :(得分:2)
我不是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
标志
答案 1 :(得分:1)
您可以按行计算空值,然后按此数字排序,然后使用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()
答案 2 :(得分:1)
您可以将groupby与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 3
答案 3 :(得分:0)
您还可以使用布尔索引:
mEffectContext.release()
答案 4 :(得分:0)
只需使用drop.duplicates()
subset
即可完成。
last
:除去最后一次出现的重复项。
>>> df.drop_duplicates(subset=['B', 'D', 'G'], keep="last")
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
3 0.0 8 15.0 3 9.0 11 0
5 1.0 6 1.0 3 44.0 2 3
答案 5 :(得分:0)
将&
与条件duplicated
和isnull
一起使用,以实现此目标的与列无关的方式
>>> to_drop = df.dropna(axis=1).duplicated(keep=False) & df.isnull().any(1)
>>> df.loc[~to_drop]