descartando linhas do dataframe com base em uma condição “fora de uso” [duplicado]

97

Quero descartar linhas de um dataframe do pandas quando o valor da coluna de data estiver em uma lista de datas. O seguinte código não funciona:

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

df=df[df.datecolumn not in a]

Estou tendo o erro a seguir:

ValueError: O valor verdadeiro de uma série é ambíguo. Use a.empty, a.bool (), a.item (), a.any () ou a.all ().

gaurav gurnani
fonte

Respostas:

180

Você pode usar pandas.Dataframe.isin.

pandas.Dateframe.isinretornará valores booleanos dependendo se cada elemento está dentro da lista aou não. Você então inverte isso com o ~para converter Truepara Falsee vice-versa.

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
fonte
7
Você provavelmente quer dizer Series.isin, não DataFrame.isin. Você está comparando por uma coluna, não um df inteiro.
Acumenus
33

Você pode usar Series.isin:

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

Embora a mensagem de erro sugira que all()ou any()possa ser usada, eles são úteis apenas quando você deseja reduzir o resultado a um único valor booleano. No entanto, não é isso que você está tentando fazer agora, que é testar a associação de todos os valores da Série em relação à lista externa e manter os resultados intactos (ou seja, uma Série Booleana que será usada para dividir o DataFrame original )

Você pode ler mais sobre isso nas dicas .

YS-L
fonte