Найдите соответствующие строки с частыми наборами элементов

Мой набор данных представляет собой матрицу смежности, сравнимую с информацией о покупателях. Пример набора данных игрушек:

p = {'A': [0,1,0,1], 'B': [1,1,1,1], 'C': [0,0,1,1], 'D': [1,1,1,0]}
df = pd.DataFrame(data=p)
df

Теперь меня интересует частый набор элементов, поэтому я использовал apriori fim:

from mlxtend.frequent_patterns import apriori
frequent_itemsets = apriori(df, min_support=0.1, use_colnames=True)
frequent_itemsets

Теперь мы видим, что набор элементов (D, B) встречается в 75% набора данных. Но меня действительно интересует, в каких строках встречается этот набор элементов, поскольку в индексе есть некоторая информация (какой клиент купил эти элементы).

Вкратце, мне любопытно, как я могу отфильтровать свой набор данных, чтобы увидеть, какие строки соответствуют определенному набору элементов. Есть ли такая функция в этом пакете / библиотеке. Чтобы я мог отфильтровать этот набор элементов (D, B) в строках 0,1 и 2?


person Tox    schedule 03.07.2020    source источник


Ответы (1)


Не похоже, что есть прямой способ сделать это через apriori. Однако один из способов будет заключаться в следующем:

from mlxtend.frequent_patterns import apriori

frequent_itemsets = apriori(df, min_support=0.1, use_colnames=True)
# lists of columns where value is 1 per row
cols = df.dot(df.columns).map(set).values.tolist()
# use sets to see which rows are a superset of the sets in cols
set_itemsets = map(set,frequent_itemsets.itemsets.values.tolist())
frequent_itemsets['indices'] = [[ix for ix,j in enumerate(cols) if i.issubset(j)] 
                                 for i in set_itemsets]

print(frequent_itemsets)

    support   itemsets       indices
0      0.50        (A)        [1, 3]
1      1.00        (B)  [0, 1, 2, 3]
2      0.50        (C)        [2, 3]
3      0.75        (D)     [0, 1, 2]
4      0.50     (A, B)        [1, 3]
5      0.25     (A, C)           [3]
6      0.25     (A, D)           [1]
7      0.50     (C, B)        [2, 3]
8      0.75     (B, D)     [0, 1, 2]
9      0.25     (C, D)           [2]
10     0.25  (A, B, C)           [3]
11     0.25  (A, B, D)           [1]
12     0.25  (C, B, D)           [2]
person yatu    schedule 03.07.2020
comment
У меня проблемы с использованием этого метода. В моем реальном наборе данных более 10 столбцов, однако с функцией карты cols учитываются только столбцы от 0 до 9. Также, если я использую настоящие имена столбцов, у меня есть эта проблема, есть ли решение для этого? - person Tox; 07.07.2020