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


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

7
Вы, наверное, имеете в виду Series.isin, что нет DataFrame.isin. Вы сравниваете столбец, а не весь df.
Acumenus

36

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.