eliminar filas del marco de datos en función de una condición "no en" [duplicado]

98

Quiero eliminar filas de un marco de datos de pandas cuando el valor de la columna de fecha está en una lista de fechas. El siguiente código no funciona:

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

df=df[df.datecolumn not in a]

Obtuve el siguiente error:

ValueError: el valor de verdad de una serie es ambiguo. Utilice a.empty, a.bool (), a.item (), a.any () o a.all ().

gaurav gurnani
fuente

Respuestas:

181

Puede utilizar pandas.Dataframe.isin.

pandas.Dateframe.isindevolverá valores booleanos dependiendo de si cada elemento está dentro de la lista ao no. A continuación, Invertir con el ~convertir Truea Falsey 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
Ffisegydd
fuente
7
Probablemente querrás decir que Series.isinno DataFrame.isin. Está comparando una columna, no un df completo.
Acumenus
33

Puede utilizar Series.isin:

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

Si bien el mensaje de error indica que all()o any()se puede utilizar, son útiles sólo cuando se desea reducir el resultado en un solo valor booleano. Sin embargo, eso no es lo que está tratando de hacer ahora, que es probar la membresía de todos los valores de la serie con la lista externa y mantener los resultados intactos (es decir, una serie booleana que luego se utilizará para cortar el DataFrame original ).

Puedes leer más sobre esto en Gotchas .

YS-L
fuente