Мой фиктивный фрейм данных выглядит следующим образом:
+--------+------+------+------+------+
| item | p1 | p2 | p3 | p4 |
|--------+------+------+------+------|
| a | 1 | 0 | 1 | 1 |
| b | 0 | 1 | 1 | 0 |
| c | 1 | 0 | 1 | 1 |
| d | 0 | 0 | 0 | 1 |
| e | 1 | 0 | 1 | 1 |
| f | 1 | 1 | 1 | 1 |
| g | 1 | 0 | 0 | 0 |
+--------+------+------+------+------+
Я хочу найти количество способов, которыми параметры p1,p2,p3,p4
используются в комбинации или нет . Ожидаемый результат примерно такой:
+--------+------+--------+--------+--------+
| Length | P-groups(s) | Count | Items |
+--------+---------------+--------+--------+
| 1 | p1 | 1 | g |
| | p4 | 1 | d |
| | | | |
| 2 | p2,p3 | 1 | b |
| | | | |
| 3 | p1,p2,p3 | 3 | [a,c,e]|
| | | | |
| 4 | p1,p2,p3,p4 | 1 | f |
+--------+---------------+--------+--------+
Итак, мой грубый код выглядит следующим образом:
import pandas as pd
from itertools import chain, combinations
df= pd.DataFrame({'item': ['a','b','c','d','e','f','g'],
'p1': [1,0,1,0,1,1,1],
'p2': [0,1,0,0,0,1,0],
'p3': [1,1,1,0,1,1,0],
'p4': [1,0,1,1,1,1,0]})
def all_subsets(ss):
return chain(*map(lambda x: combinations(ss, x), range(0, len(ss)+1)))
subsets = []
for subset in all_subsets(list(df)[1:]):
subsets.append(list(subset))
for grp in subsets[1:]: #subset[1:] is to exclude empty set
print df.groupby(grp).size().reset_index().rename(columns={0:'count'})
Мне было интересно, есть ли какой-нибудь способ панды получить ожидаемый результат?