Löschen von Zeilen aus dem Datenrahmen basierend auf einer Nicht-In-Bedingung [Duplikat]

94

Ich möchte Zeilen aus einem Pandas-Datenrahmen löschen, wenn sich der Wert der Datumsspalte in einer Datumsliste befindet. Der folgende Code funktioniert nicht:

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

df=df[df.datecolumn not in a]

Ich erhalte folgende Fehlermeldung:

ValueError: Der Wahrheitswert einer Serie ist nicht eindeutig. Verwenden Sie a.empty, a.bool (), a.item (), a.any () oder a.all ().

Gaurav Gurnani
quelle

Antworten:

173

Sie können verwenden pandas.Dataframe.isin.

pandas.Dateframe.isinGibt boolesche Werte zurück, je nachdem, ob sich jedes Element in der Liste befindet aoder nicht. Sie dann invertieren mit dem ~konvertieren Truezu , Falseund umgekehrt.

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
quelle
7
Du meinst wahrscheinlich Series.isinnicht DataFrame.isin. Sie vergleichen für eine Spalte, nicht für eine ganze df.
Acumenus
33

Sie können verwenden Series.isin:

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

Während die Fehlermeldung vorschlägt, dass all()oder any()verwendet werden kann, sind sie nur dann nützlich, wenn Sie das Ergebnis auf einen einzelnen Booleschen Wert reduzieren möchten. Dies ist jedoch nicht das, was Sie jetzt versuchen, nämlich die Mitgliedschaft aller Werte in der Serie anhand der externen Liste zu testen und die Ergebnisse intakt zu halten (dh eine boolesche Serie, die dann zum Schneiden des ursprünglichen DataFrame verwendet wird ).

Mehr dazu lesen Sie in den Gotchas .

YS-L
quelle