python - 如何将一个熊猫分成多个groupby?
问题描述
我有一个客户的交易和社会群体的数据框:
print(df.sample(10))
Shop Transaction_value Social Group
7 KFC 7 Rich
22 Burger King 342 Rich
19 Burger King 6 Rich
5 KFC 2 Poor
14 McDonalds 245 Rich
2 KFC 3 Poor
16 McDonalds 56 Poor
6 KFC 6 Poor
20 Burger King 23 Poor
8 KFC 5 Poor
我做了一个 groupby,它告诉我每家商店最常见的社交群体:
(df.groupby(['Shop', 'Social Group'])['Transaction_value'].count())
Shop Social Group
Burger King Poor 7
Rich 3
KFC Poor 6
Rich 3
McDonalds Poor 3
Rich 6
我想将上面的数字除以value_counts()
每个社会群体的数字:
df['Social Group'].value_counts()
Poor 16
Rich 12
所以在我的第一个 groupby 中,无论我们有什么,Poor
我都想除以 16。无论我们有Rich
什么,我都想除以 12。
所以我会有一个这样的数据框:
Shop Social Group
Burger King Poor 0.43
Rich 0.25
KFC Poor 0.37
Rich 0.37
McDonalds Poor 0.25
Rich 0.5
我已经div()
为此尝试过。我认为索引会在每个数据帧中匹配,但它不起作用:
(df.groupby(['Shop', 'Social Group'])['Transaction_value']
.count()
.div(df['Social Group'].value_counts()))
ValueError: cannot join with no overlapping index names
我正在尝试使用内置的 pandas 函数来做些什么吗?
我想我可以用 for 循环来做到这一点——但这需要很多时间。
我的df:
df.to_dict()
{'Shop': {0: 'KFC',
1: 'KFC',
2: 'KFC',
3: 'KFC',
4: 'KFC',
5: 'KFC',
6: 'KFC',
7: 'KFC',
8: 'KFC',
9: 'McDonalds',
10: 'McDonalds',
11: 'McDonalds',
12: 'McDonalds',
13: 'McDonalds',
14: 'McDonalds',
15: 'McDonalds',
16: 'McDonalds',
17: 'McDonalds',
18: 'Burger King',
19: 'Burger King',
20: 'Burger King',
21: 'Burger King',
22: 'Burger King',
23: 'Burger King',
24: 'Burger King',
25: 'Burger King',
26: 'Burger King',
27: 'Burger King'},
'Transaction_value': {0: 1,
1: 2,
2: 3,
3: 34,
4: 2,
5: 2,
6: 6,
7: 7,
8: 5,
9: 4,
10: 3,
11: 2,
12: 12,
13: 31,
14: 245,
15: 123,
16: 56,
17: 67,
18: 68,
19: 6,
20: 23,
21: 44,
22: 342,
23: 234,
24: 3,
25: 234,
26: 666,
27: 88},
'Social Group': {0: 'Poor',
1: 'Rich',
2: 'Poor',
3: 'Poor',
4: 'Rich',
5: 'Poor',
6: 'Poor',
7: 'Rich',
8: 'Poor',
9: 'Rich',
10: 'Rich',
11: 'Rich',
12: 'Rich',
13: 'Rich',
14: 'Rich',
15: 'Poor',
16: 'Poor',
17: 'Poor',
18: 'Poor',
19: 'Rich',
20: 'Poor',
21: 'Poor',
22: 'Rich',
23: 'Poor',
24: 'Poor',
25: 'Rich',
26: 'Poor',
27: 'Poor'}}
解决方案
你很接近,需要level=1
匹配第二级MultiIndex
:
s = df['Social Group'].value_counts()
s1 = df.groupby(['Shop', 'Social Group'])['Transaction_value'].count().div(s, level=1)
print (s1)
Shop Social Group
Burger King Poor 0.4375
Rich 0.2500
KFC Poor 0.3750
Rich 0.2500
McDonalds Poor 0.1875
Rich 0.5000
dtype: float64
推荐阅读
- java - 有没有办法使用scanner().nextLine 方法用数字标记特定名称,如果它们具有相同的名称,则未来的行
- html - 显示内联单选按钮,间距为 div 的全宽
- django - 连接到本地 docker-compose 容器 Windows 10
- arduino - RCSwitch 库似乎不适用于 ESP32 NodeMCU 上的 433 Hz 接收器
- r - 带热图的圆形树
- c# - C# ASP.NET MVC 路由不返回成功页面的视图
- swift - 如何显示/隐藏添加到 NSWindow 标题栏的按钮?
- git - 我做了 git pull --rebase 现在我的分支中有其他人的提交 - 为什么
- c# - 仅当前面没有制表符或空格时才匹配括号组
- javascript - 如何在javascript中对带有负数的表格进行排序