按列分组并有一列带有 value_counts 字典

Posted

技术标签:

【中文标题】按列分组并有一列带有 value_counts 字典【英文标题】:Group by column and have a column with a value_counts dictionary 【发布时间】:2020-05-17 20:36:28 【问题描述】:

我有一张包含客户购买历史记录的销售表。我想制作一个按客户分组的新数据框。数据框还应包含一列,其中包含客户已购买的所有产品的 value_counts 字典以及每种产品的数量。

我做了以下事情:

categories = data.groupby(by=['CustomerID']).Description.value_counts().to_frame().rename(columns='Description':'Counts').reset_index(level='Description')

产生这个:

              Description          Counts
CustomerID
3004000304    MAJOR APPLIANCES     3
3004000304    HOME OFFICE          2
3004000304    ACCESSORIES          1
3004002756    MAJOR APPLIANCES     1
3004002946    HOME OFFICE          2
3004002946    ACCESSORIES          1
3004002946    MAJOR APPLIANCES     1 

我试过看看是否可以像这样修复上述数据框:

categories['Merged'] = categories.apply(lambda x: x['Description']:x['Counts'], axis=1)

这给了我这个:

              Description          Counts   Merged
CustomerID
3004000304    MAJOR APPLIANCES     3        'MAJOR APPLIANCES': 3
3004000304    HOME OFFICE          2        'HOME OFFICE': 2
3004000304    ACCESSORIES          1        'ACCESSORIES': 1
3004002756    MAJOR APPLIANCES     1        'MAJOR APPLIANCES': 1
3004002946    HOME OFFICE          2        'HOME OFFICE': 2
3004002946    ACCESSORIES          1        'ACCESSORIES': 1
3004002946    MAJOR APPLIANCES     1        'MAJOR APPLIANCES': 1

但我想要这个:

              Counts
CustomerID
3004000304    'MAJOR APPLIANCES': 3, 'HOME OFFICE': 2, 'ACCESSORIES': 1
3004002756    'MAJOR APPLIANCES': 1
3004002946    'HOME OFFICE': 2, 'ACCESSORIES': 1, 'MAJOR APPLIANCES': 1

非常感谢您对生成上述数据框的帮助

【问题讨论】:

【参考方案1】:

GroupBy.apply 与带有zipdict 的lambda 函数一起使用:

f = lambda x: dict(zip(x['Description'], x['Counts']))
df = categories.groupby(level=0).apply(f).to_frame('Counts')
print (df)
                                                       Counts
CustomerID                                                   
3004000304  'MAJOR APPLIANCES': 3, 'HOME OFFICE': 2, 'ACC...
3004002756                            'MAJOR APPLIANCES': 1
3004002946  'HOME OFFICE': 2, 'ACCESSORIES': 1, 'MAJOR AP...

【讨论】:

以上是关于按列分组并有一列带有 value_counts 字典的主要内容,如果未能解决你的问题,请参考以下文章

熊猫数据框按列位置分组

使用Python按列分组并汇总另一列的内容

按列分组,优先选择另一列不为空的行

按列分组,结果限制并按另一列轨道排序

使用pandas按列分组,然后根据条件新建一列

在 xsl:fo 表中按列行值分组