python-3.x - 按列分组,并有一列带有 value_counts 字典
问题描述
我有一张包含客户购买历史的销售表。我想制作一个按客户分组的新数据框。数据框还应包含一列,其中包含客户已购买的所有产品的 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}
对生成上述数据框的一些帮助将不胜感激
解决方案
GroupBy.apply
与 lambda 函数一起使用zip
and dict
:
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...
推荐阅读
- javascript - FullCalendar 事件对象:非标准字段 (GCal)
- swift - 使用从系统收集的数据初始化模型类的正确方法 (macOS)
- macos - 在 Cocoa Swift Macos 中以编程方式制作标签视图
- angular - Angular 4 两次调用 WCF REST
- netlogo - NetLogo - 随机分配总人口阈值为 5% 的变量
- hockeyapp - 使用 Visual Studio App Center (Hockeyapp?),我可以让用户通过电子邮件向我发送他们的崩溃日志或标识自己,以便我可以找到他们的特定崩溃吗?
- java - 为什么带有令牌的 Java HTTP 请求总是未经授权
- reactjs - .NET Core 2.2 Web API、React 和 Google V8
- html - 在圆形上展开背景
- html - VBA网页抓取:点击可点击的下拉菜单(不悬停)