Проблема с запросом панд для фрейма данных - PullRequest
1 голос
/ 30 октября 2019

Рассмотрим следующее.

import pandas as pd
d=pd.DataFrame([[1,'a'],[1,'b'],[2,'c'],[2,'a'],[3,'c'],[4,'a'],[4,'c']],columns=['A','B'])

Я хочу те значения в A, которые ТОЛЬКО связаны с 'c' ('c' и только с '). Существует только одна такая ценность. Это 3. Я написал следующий запрос, но он не возвращает правильный результат.

d[ d.B.isin(['c'])  & ~d.A.isin(d[d.B.isin(set(d.B.unique())-{'c'})].A.to_frame()) ].A.to_frame()

Моя идея состоит в том, чтобы найти все значения в A, с которыми связана 'c', а затем удалить из них те значения, с которыми также связано что-то отличное от 'c'. Но то, что код возвращает, это просто значения, с которыми связан 'c'. Может кто-то помочь мне с этим? Спасибо.

1 Ответ

1 голос
/ 30 октября 2019

Самая простая идея - фильтровать значения с c и не разрешать дубликаты в столбце A:

s1 = d.loc[d.B.eq('c') & ~d.A.duplicated(keep=False), 'A']
print (s1)
4    3
Name: A, dtype: int64

Ваше решение работает путем удаления .to_frame(), но лучше использовать loc длявыбор по маске - порядок оценки имеет значение :

s2 = d.loc[ d.B.isin(['c'])  & ~d.A.isin(d.loc[d.B.isin(set(d.B.unique())-{'c'}), 'A']), 'A']
print (s2)
4    3
Name: A, dtype: int64

s2 = d[ d.B.isin(['c'])  & ~d.A.isin(d[d.B.isin(set(d.B.unique())-{'c'})].A) ].A
print (s2)
4    3
Name: A, dtype: int64
...