Невыравниваемый логический ряд, предоставляемый как индексатор

#python #pandas #filtering

#питон #панды #фильтрация

Вопрос:

Я пытаюсь отфильтровать фрейм данных как:

 a= a[~(b['var1'].isin(c['var2']))]
 

но получите следующую ошибку:

 "Unalignable boolean Series provided as "
pandas.core.indexing.IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).
 

Я понимаю, что заявление:

 print(~(b['var1'].isin(c['var2'])) [:10])
 

возвращает ряд с логической маскировкой, который может быть неприемлемым. Итак, я попытался использовать loc как:

 a= a.loc[:, ~(b['var1'].isin(c['var2']))]
 

но я получаю ту же ошибку. Что я здесь упускаю из виду? Любой вклад будет оценен.

Спасибо

Комментарии:

1. a,b,c есть ли 3 разных фрейма данных?

2. да, это три разных фрейма данных

Ответ №1:

Ошибка означает, что существуют разные индексы a и маски, созданные с isin помощью, это означает другой индекс b .

 mask = ~(b['var1'].isin(c['var2']))
 

Таким образом, возможным решением является изменение индекса на a.index , а для не совпадающих значений добавьте False s:

 a[mask.reindex(a.index, fill_value=False)]
 

Или:

 a[~(b['var1'].reindex(a.index, fill_value=False).isin(c['var2']))]
 

Комментарии:

1. Сработало великолепно. И это имеет смысл. Мне было интересно, было бы лучше написать этот код более интуитивно (в традиционном смысле обработки данных), возможно, как своего рода соединение / слияние?

2. @flying_fluid_four — да, другая идея — создать новый фрейм данных из a, b like df = a.join(b['var1']) , а затем фильтровать a[~(df['var1'].isin(c['var2']))]

3. @flying_fluid_four — Но необходимо не вводить неправильные значения c['var2'] , потому что differnece b['var1'] и df['var1'] is с пропущенными значениями для непревзойденного индекса.