видалення рядків з фрейму даних на основі стану „не в“ [дублікат]


97

Я хочу скинути рядки з кадру даних 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 ().

Відповіді:


180

Можна використовувати 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.
Проникність

33

Ви можете використовувати Series.isin:

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

Незважаючи на те, що повідомлення про помилку говорить про те, що all()або any()може бути використане, вони корисні лише тоді, коли потрібно зменшити результат до одного логічного значення. Однак це не те, що ви намагаєтеся зробити зараз, а саме: перевірити приналежність усіх значень у серії до зовнішнього списку та зберегти результати в цілості (тобто логічну серію, яка потім буде використана для нарізання оригінального DataFrame ).

Детальніше про це ви можете прочитати в Gotchas .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.