Найти наиболее распространенные пары в нескольких столбцах - PullRequest
1 голос
/ 04 октября 2019

У меня есть pandas dataframe, который выглядит следующим образом:

Client   1_act      2_act      3_act      4_act      5_act      6_act   ...
1        hiking     swimming   skating    jumping    climbing   eating
2        eating     hiking     climbing   exploring  
3        hiking     exercising 
4        hiking     screaming  yelling    hopping    swimming  
...

Каждая строка имеет только уникальные действия и может иметь МНОГИЕ столбцы с именем #_act (новые столбцы также могут быть добавлены в любое время в качестве клиентасообщает о новой деятельности). В каждом ряду есть хотя бы пара (ни у кого нет менее 2 занятий в ряду). Новые значения активности также могут быть добавлены в любое время.

Я пытаюсь найти способ вернуть наиболее распространенную пару действий. Таким образом, желаемый результат будет выглядеть следующим образом:

Pair                       Qty
(hiking, swimming)         2
(hiking, skating)          1
(hiking, jumping)          1
(hiking, climbing)         2
(hiking, eating)           2
(swimming, skating)        1
(swimming, jumping)        1
(swimming, climbing)       1
(swimming, eating)         1
(skating, jumping)         1
(skating, climbing)        1
(skating, eating)          1
(jumping, climbing)        1
(climbing, eating)         2
(eating, exploring)        1
(hiking, exercising)       1
(hiking, screaming)        1
(hiking, yelling)          1
(hiking, hopping)          1

...

Приведенный выше вывод является примером вывода всех возможных пар в каждой строке по всем их столбцам в этом образце набора данных. Если пара повторяется в последующих строках, это должно добавить к количеству, а если новая пара встречается в последующих строках, она должна быть добавлена ​​в столбец пар как новая строка.

Цель этого состоит в том, чтобыПосмотрите, какие виды деятельности являются наиболее распространенными среди всех клиентов. Любая помощь будет принята с благодарностью! Спасибо !!

1 Ответ

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

Используйте combinations в списочном понимании для выравнивания, подсчитайте кортежи по Counter и передайте в DataFrame конструктор:

from collections import Counter
from  itertools import combinations

df = df.set_index('Client')

c = Counter([y for x in df.values for y in combinations(x, 2)])
df = pd.DataFrame({'Pair': list(c.keys()), 'Qty': list(c.values())})

Для верхних комбинаций:

n = 10
L = Counter([y for x in df.values for y in combinations(x, 2)]).most_common(n)

df = pd.DataFrame(L, columns=['Pair', 'Qty'])
print (df)
                   Pair  Qty
0    (hiking, swimming)    2
1    (hiking, climbing)    2
2      (hiking, eating)    2
3    (swimming, eating)    2
4     (hiking, hopping)    2
5     (hiking, skating)    1
6     (hiking, jumping)    1
7   (swimming, skating)    1
8   (swimming, jumping)    1
9  (swimming, climbing)    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...