Удаление строк из фреймворка на основе условия "не в состоянии"
Я хочу удалить строки из фрейма 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.