Pandas - 删除与其他行

时间:2017-07-03 16:32:36

标签: python pandas

我需要从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值的行。

你如何使用熊猫来执行此操作?谢谢!

3 个答案:

答案 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

然后,您可以按列DataFrameC进行排序。这会将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