如何使用Pandas来计算每一个组合包括

2024-10-03 02:35:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我想弄清楚顾客一起买的衣服是什么组合。我能算出确切的组合,但我搞不清的问题是包括组合+其他组合的计数。在

例如,我有:

Cust_num  Item    Rev
Cust1     Shirt1  $40
Cust1     Shirt2  $40
Cust1     Shorts1 $40
Cust2     Shirt1  $40
Cust2     Shorts1 $40

这将导致:

^{pr2}$

我所能做的就是独特的组合:

Combo                 Count
Shirt1,Shirt2,Shorts1   1
Shirt1,Shorts1          1

我试过了:

df = df.pivot(index='Cust_num',columns='Item').sum()
df[df.notnull()] = "x"
df = df.loc[:,"Shirt1":].replace("x", pd.Series(df.columns, df.columns))
col = df.stack().groupby(level=0).apply(','.join)
df2 = pd.DataFrame(col)
df2.groupby([0]).size().reset_index(name='counts')

但这只是独一无二的。在


Tags: columnsdfindexcolitemnumpddf2
3条回答

我认为你需要先创建一个项目的组合。在

How to get all possible combinations of a list’s elements?

我使用了danh的答案中的函数。在

from itertools import chain, combinations
def all_subsets(ss):
    return chain(*map(lambda x: combinations(ss, x), range(0, len(ss)+1)))

uq_items = df.Item.unique()

list(all_subsets(uq_items))

[(),
 ('Shirt1',),
 ('Shirt2',),
 ('Shorts1',),
 ('Shirt1', 'Shirt2'),
 ('Shirt1', 'Shorts1'),
 ('Shirt2', 'Shorts1'),
 ('Shirt1', 'Shirt2', 'Shorts1')]

并使用groupby每个客户获得他们的项目组合。在

^{pr2}$

然后转换为Series并使用value_counts()。在

pd.Series(np.concatenate(ls)).value_counts()

(Shirt1, Shorts1)            2
(Shirt2, Shorts1)            1
(Shirt1, Shirt2, Shorts1)    1
(Shirt1, Shirt2)             1

迟答,但您可以使用:

df = df.groupby(['Cust_num'], as_index=False).agg(','.join).drop(columns=['Rev']).set_index(['Item']).rename_axis("combo").rename(columns={"Cust_num": "Count"})
df['Count'] = df['Count'].str.replace(r'Cust','')

^{pr2}$

使用pandas.DataFrame.groupby

grouped_item = df.groupby('Cust_num')['Item']
subsets = grouped_item.apply(lambda x: set(x)).tolist()
Count = [sum(s2.issubset(s1) for s1 in subsets) for s2 in subsets]
combo = grouped_item.apply(lambda x:','.join(x))
combo = combo.reset_index()
combo['Count']=Count

输出:

^{pr2}$

相关问题 更多 >