#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
likedf = a.join(b['var1'])
, а затем фильтроватьa[~(df['var1'].isin(c['var2']))]
3. @flying_fluid_four — Но необходимо не вводить неправильные значения
c['var2']
, потому что differneceb['var1']
иdf['var1']
is с пропущенными значениями для непревзойденного индекса.