2015-01-15 16 views
16

Voglio eliminare righe da un dataframe panda quando il valore della colonna della data è in un elenco di date. Il seguente codice non funziona:eliminazione di righe dal dataframe in base a una condizione "non in"

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

df=df[df.datecolumn not in a] 

ottengo il seguente errore:

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

risposta

19

È possibile utilizzare pandas.Dataframe.isin.

pandas.Dateframe.isin restituirà valori booleani a seconda che ciascun elemento sia all'interno dell'elenco a oppure no. Quindi si inverte questo valore con ~ per convertire True in False e viceversa.

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

funziona .. grazie –

8

È possibile utilizzare isin:

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

Mentre il messaggio di errore suggerisce che all() o any() può essere utilizzati, sono utili solo quando si desidera ridurre il risultato in un singolo valore booleano. Questo però non è quello che stai cercando di fare ora, ovvero testare l'appartenenza di tutti i valori della serie rispetto all'elenco esterno e mantenere intatti i risultati (ovvero una serie booleana che verrà quindi utilizzata per tagliare il DataFrame originale).

Ulteriori informazioni a riguardo sono disponibili nello Gotchas.

+0

Ha funzionato .. Grazie –

Problemi correlati