Проверка, являются ли значения в столбце надмножеством другого массива - PullRequest
1 голос
/ 28 января 2020

У меня есть эти данные в качестве примера. Мне нужно проверить, какие a значения имеют все соответствующие значения b. Например, которые a имеют все [1,2] соответствующие b значения.

In [1]:
    df = pd.DataFrame( {'a':['A','A','A','B','B','B','C','C'], 'b':[1,2,3,2,3,4,1,2]})
    df

Out[1]: 
        a   b
    0   A   1
    1   A   2
    2   A   3
    3   B   2
    4   B   3
    5   B   4
    6   C   1
    7   C   2

Так что для этого примера я хотел бы вернуть список

    a
0   A
1   C

или

['A', 'B']

Сначала я думаю, что я должен сгенерировать список b значений для каждого a

In [2]:
    df1 = df.groupby('a')['b'].apply(list).reset_index(name='b_list')
    df1

Out[2]: 
        a   b_list
    0   A   [1, 2, 3]
    1   B   [2, 3, 4]
    2   C   [1, 2]

Предполагая, что это правильный первый шаг, что мне делать дальше?

Я был бы очень признателен за решения, использующие только те инструменты, которые pandas предоставляет

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Используйте сводную таблицу:

df.pivot('a','b','a').dropna(subset=[1,2]).index

Или используйте groupby:

df.groupby('a').b.apply(lambda x: set(x.tolist()).issuperset([1,2]))

или, если вам это нужно в списке:

(
    df.groupby('a')
    .b.apply(lambda x: set(x.tolist()).issuperset([1,2])).loc[lambda x: x]
    .index.tolist()
)
1 голос
/ 28 января 2020

Используйте Series.map с лямбда-функцией:

df1.loc[df1.b_list.map(lambda x: set(x).issuperset(L)), 'a']
print (s)
0    A
2    C
Name: a, dtype: object

Anf для списка:

a = df1.loc[df1.b_list.map(lambda x: set(x).issuperset(L)), 'a'].tolist()
print (a)
['A', 'C']

При использовании issubset решение без лямбды:

s = df1.loc[df1.b_list.map(set(L).issubset), 'a']
print (s)
0    A
2    C
Name: a, dtype: object

a = df1.loc[df1.b_list.map(set(L).issubset), 'a'].tolist()
print (a)
['A', 'C']
...