gpt4 book ai didi

Python Pandas 按类别分组占总数的百分比

转载 作者:行者123 更新时间:2023-12-04 09:59:16 24 4
gpt4 key购买 nike

我有下表:

+-----+----------+---+
| Grp | Category | X |
+-----+----------+---+
| 1 | A | 1 |
| 1 | B | 3 |
| 1 | B | 2 |
| 1 | C | 2 |
| 2 | A | 2 |
| 2 | A | 4 |
| 2 | B | 4 |
| 3 | A | 3 |
| 3 | C | 7 |
+-----+----------+---+

并试图获得以下内容:
+-----+----------+---------+
| Grp | Category | X_ratio |
+-----+----------+---------+
| 1 | A | 1/8 |
| 1 | B | 5/8 |
| 1 | C | 2/8 |
| 2 | A | 6/10 |
| 2 | B | 4/10 |
| 3 | A | 3/10 |
| 3 | C | 7/10 |
+-----+----------+---------+

而且有点卡住了。
有人提出有效的解决方案吗?

我当前的代码 - 它可以工作,但似乎效率不高:
grp_Cat = df.groupby(['Grp', 'Category ']).agg({'X': 'sum'})
grp_total = df.groupby(['Grp']).agg({'X': 'sum'})
grp_Cat.div(grp_total, level='Grp') * 100

最佳答案

因为性能很重要,首先聚合sumMultiIndex Series然后除以 Series.div 每个第一的总和值 Grp等级:

s = df.groupby(['Grp','Category'])['X'].sum()
df = s.div(s.sum(level=0), level=0).reset_index(name='X_ratio')
print (df)
Grp Category X_ratio
0 1 A 0.125
1 1 B 0.625
2 1 C 0.250
3 2 A 0.600
4 2 B 0.400
5 3 A 0.300
6 3 C 0.700

较慢的替代方案:
df = (df.groupby(['Grp','Category'])['X'].sum()
.groupby(level=0)
.apply(lambda x: x / x.sum())
.reset_index(name='X_ratio'))
print (df)
Grp Category X_ratio
0 1 A 0.125
1 1 B 0.625
2 1 C 0.250
3 2 A 0.600
4 2 B 0.400
5 3 A 0.300
6 3 C 0.700

关于Python Pandas 按类别分组占总数的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61864575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com