Найти значения в одном столбце, которые связаны с определенными значениями в другом столбце - PullRequest
2 голосов
/ 08 апреля 2020

У меня есть следующий пример pandas dataframe:

df = pd.DataFrame({'A': ['a1', 'a2', 'a3', 'a1', 'a2', 'a4'],
                   'B': ['b1', 'b1', 'b2', 'b3', 'b6', 'b6']})

Я хочу найти значения в A, которые связаны со всеми значениями входного списка в B.

Например, для входа lst = ['b1', 'b6'] желаемый вывод - ['a2']. Я пробовал df[df['B'].isin(lst)] из здесь , но этого на самом деле еще недостаточно или, возможно, даже не нужно.

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Первый фильтр df для каждого элемента lst с использованием понимания списка

a_list = [ df.loc[df['B']==el,'A'].tolist() for el in lst]
# [['a1', 'a2'], ['a2', 'a4']]

Значения, которые вы ищете, являются пересечением всех списков в a_list

list(set.intersection(*[set(x) for x in a_list]))
# ['a2']
1 голос
/ 08 апреля 2020

Использование set.issubset для проверки, находится ли один список в другом:

m = df.groupby('A')['B'].apply(lambda x: set(lst).issubset(set(x)))
df[df['A'].map(m)]

    A   B
0  a1  b1
1  a2  b1
3  a1  b3
4  a2  b6
7  a2  b7
8  a1  b6
1 голос
/ 08 апреля 2020

Мы можем сделать это groupby + filter с isin + all

df.groupby('A').filter(lambda x : pd.Series(lst).isin(x['B']).all())
    A   B
1  a2  b1
4  a2  b6

Или

s=pd.crosstab(df.A,df.B).ge(1)[lst].all(1) # you have the series 
s # s[s].index
A
a1    False
a2     True
a3    False
a4    False
dtype: bool
...