Удаление строк из фреймворка на основе условия "не в состоянии"

Я хочу удалить строки из фрейма pandas, когда значение столбца даты находится в списке дат. Следующий код не работает:

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

df=df[df.datecolumn not in a]

Я получаю следующую ошибку:

ValueError: значение истины серии неоднозначно. Используйте команды a.empty, a.bool(), a.item(), a.any() или a.all().

Ответ 1

Вы можете использовать pandas.Dataframe.isin.

pandas.Dateframe.isin будет возвращать логические значения в зависимости от того, находится ли каждый элемент внутри списка a или нет. Затем вы инвертируете это с помощью ~ для преобразования True в False и наоборот.

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

Ответ 2

Вы можете использовать Series.isin:

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

Хотя в сообщении об ошибке указывается, что можно использовать all() или any(), они полезны только тогда, когда вы хотите свести результат в одно логическое значение. Это, однако, не то, что вы пытаетесь сделать сейчас, это проверить членство всех значений в Серии по отношению к внешнему списку и сохранить результаты нетронутыми (т.е. булеву Серию, которая затем будет использоваться для нарезки исходного DataFrame).

Вы можете прочитать больше об этом в Gotchas.