2015-01-15 24 views
16

Ich möchte Zeilen aus einem Pandas Dataframe löschen, wenn der Wert der Datumsspalte in einer Datumsliste ist. Der folgende Code funktioniert nicht:Zeilen aus Datenframe basierend auf einer "nicht in" Bedingung löschen

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

df=df[df.datecolumn not in a] 

ich die folgende Fehlermeldung erhalten:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Antwort

19

Sie können pandas.Dataframe.isin verwenden.

pandas.Dateframe.isin gibt boolesche Werte zurück, je nachdem, ob sich jedes Element in der Liste befindet a oder nicht. Sie invertieren das dann mit dem ~, um True in False umzuwandeln und 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 
+0

es funktioniert .. danke –

8

Sie verwenden isin:

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

Während die Fehlermeldung deutet darauf hin, dass all() oder any() können Wenn sie verwendet werden, sind sie nur nützlich, wenn Sie das Ergebnis auf einen einzelnen booleschen Wert reduzieren möchten. Das ist jedoch nicht das, was Sie jetzt versuchen, nämlich die Zugehörigkeit aller Werte in der Reihe gegen die externe Liste zu testen und die Ergebnisse intakt zu halten (dh eine Boolesche Reihe, die dann zum Zerschneiden des ursprünglichen Datenrahmens verwendet wird)).

Sie können mehr darüber in der Gotchas lesen.

+0

Es funktionierte .. Danke –

Verwandte Themen