我需要从pandas.DataFrame中删除所有行,这些行满足异常条件。
如果有完全相同的行,除了它在列#34; C"中有Nan值,我想删除这一行。
给出一张表:
A B C D
1 2 NaN 3
1 2 50 3
10 20 NaN 30
5 6 7 8
我需要删除第一行,因为它在C列中有Nan,但在C列中有完全相同的行(第二行)具有实际值。
但是,第3行必须保留,因为没有具有相同A,B和D值的行。
你如何使用熊猫来执行此操作?谢谢!
答案 0 :(得分:3)
您可以使用drop_duplicates
来实现。
初始DataFrame
:
df=pd.DataFrame(columns=['a','b','c','d'], data=[[1,2,None,3],[1,2,50,3],[10,20,None,30],[5,6,7,8]])
df
a b c d
0 1 2 NaN 3
1 1 2 50 3
2 10 20 NaN 30
3 5 6 7 8
然后,您可以按列DataFrame
对C
进行排序。这会将NaN
放到列的底部:
df = df.sort_values(['c'])
df
a b c d
3 5 6 7 8
1 1 2 50 3
0 1 2 NaN 3
2 10 20 NaN 30
然后删除重复项,选择忽略C
并保留第一个捕获行的列中的列:
df1 = df.drop_duplicates(['a','b','d'], keep='first')
a b c d
3 5 6 7 8
1 1 2 50 3
2 10 20 NaN 30
但只有当NaN
位于C
列时才有效。
答案 1 :(得分:2)
你可以尝试fillna和drop_duplicates
df.bfill().ffill().drop_duplicates(subset=['A', 'B', 'D'], keep = 'last')
这将处理诸如A,B和D值相同但C在两个行中都具有非NaN值的情况。 你得到了
A B C D
1 1 2 50 3
2 10 20 Nan 30
3 5 6 7 8
答案 2 :(得分:2)
这对我来说是对的
notdups = ~df.duplicated(df.columns.difference(['C']), keep=False)
notnans = df.C.notnull()
df[notdups | notnans]
A B C D
1 1 2 50.0 3
2 10 20 NaN 30
3 5 6 7.0 8