удаление строк из фрейма данных на основании условия «не в» [дубликат]

102

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

Гарав Гурнани
источник

Ответы:

195

Вы можете использовать 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
Ffisegydd
источник
7
Вы, наверное, имеете в виду Series.isin, что нет DataFrame.isin. Вы сравниваете столбец, а не весь df.
Acumenus
36

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

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

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

Вы можете прочитать об этом подробнее в разделе « Подборки» .

YS-L
источник