Muszę usunąć wszystkie wiersze z pandas.dataframe, które spełniają niezwykły stan.

W przypadku, gdy istnieje dokładnie ten sam wiersz, z wyjątkiem, że ma wartość Nan w kolumnie "C", chcę usunąć ten wiersz.

Biorąc pod uwagę tabelę:

A    B    C      D
1    2    NaN    3
1    2    50     3
10   20   NaN    30
5    6    7      8

Muszę usunąć pierwszy wiersz, ponieważ ma NAN w kolumnie C, ale jest absolutnie taki sam wiersz (drugi) z rzeczywistą wartością w kolumnie C.

Jednak trzecie rzędu musi pozostać, ponieważ nie ma żadnych wierszy o tych samych wartościach A, B i D, tak jak ma.

Jak wykonujesz to za pomocą pandy? Dziękuję Ci!

0
fremorie 3 lipiec 2017, 19:32

3 odpowiedzi

Najlepsza odpowiedź

Możesz osiągnąć przy użyciu drop_duplicates.

Inicjał 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

Następnie możesz sortować DataFrame za pomocą kolumny C. To spadnie NaN s do dolnej części kolumny:

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

Następnie usuń duplikaty wybierające do wyboru pod uwagę kolumny z ignorowanie C i zachowując pierwszy wiersz:

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

Ale będzie ważny tylko wtedy, gdy NaN s są w kolumnie {X1}}.

2
Dmitriy Fialkovskiy 3 lipiec 2017, 16:55

Możesz spróbować Fillna wraz z kroplami

df.bfill().ffill().drop_duplicates(subset=['A', 'B', 'D'], keep = 'last')

Spowoduje to obsługę scenariusza, takiego jak wartości A, B i D są takie same, ale C ma wartości nie Nan w obu wierszach. Dostajesz

    A   B   C   D
1   1   2   50  3
2   10  20  Nan 30
3   5   6   7   8
2
Vaishali 3 lipiec 2017, 16:50

To jest dla mnie odpowiednie

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
2
piRSquared 3 lipiec 2017, 21:56