usuwanie wierszy z ramki danych na podstawie warunku „nie w” [duplikat]

102

Chcę usunąć wiersze z ramki danych pandy, gdy wartość kolumny daty znajduje się na liście dat. Poniższy kod nie działa:

a=['2015-01-01' , '2015-02-01']

df=df[df.datecolumn not in a]

Otrzymuję następujący błąd:

ValueError: Wartość prawdziwości serii jest niejednoznaczna. Użyj a.empty, a.bool (), a.item (), a.any () lub a.all ().

gaurav gurnani
źródło

Odpowiedzi:

195

Możesz użyć pandas.Dataframe.isin.

pandas.Dateframe.isinzwróci wartości logiczne w zależności od tego, czy każdy element znajduje się na liście, aczy nie. Następnie odwracasz to za pomocą, ~aby przekonwertować Truena Falsei odwrotnie.

import pandas as pd

a = ['2015-01-01' , '2015-02-01']

df = pd.DataFrame(data={'date':['2015-01-01' , '2015-02-01', '2015-03-01' , '2015-04-01', '2015-05-01' , '2015-06-01']})

print(df)
#         date
#0  2015-01-01
#1  2015-02-01
#2  2015-03-01
#3  2015-04-01
#4  2015-05-01
#5  2015-06-01

df = df[~df['date'].isin(a)]

print(df)
#         date
#2  2015-03-01
#3  2015-04-01
#4  2015-05-01
#5  2015-06-01
Ffisegydd
źródło
7
Prawdopodobnie masz na myśli Series.isin, że nie DataFrame.isin. Porównujesz dla kolumny, a nie całego df.
Acumenus,
36

Możesz użyć Series.isin:

df = df[~df.datecolumn.isin(a)]

Chociaż komunikat o błędzie sugeruje, że all()lub any()można ich użyć, są one przydatne tylko wtedy, gdy chcesz zredukować wynik do pojedynczej wartości logicznej. Nie jest to jednak to, co próbujesz teraz zrobić, czyli przetestować przynależność każdej wartości w Serii do listy zewnętrznej i zachować wyniki w nienaruszonym stanie (tj. Seria Boolean, która zostanie następnie użyta do wycięcia oryginalnego DataFrame ).

Możesz przeczytać więcej na ten temat w Gotchas .

YS-L
źródło