看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
如给出的数数据,按品类汇总,如果累计数量:
怎么计算每一行的提成金额,提成金额=金额*提成比例。
需求中的数据构造如下:
import pandas as pd
df = pd.DataFrame({'品类': [*'CABABDBA'],
'数量': [10,20,30,50,10,40,50,90],
'金额': range(100,108,1)
})
df
'''
品类 数量 金额
0 C 10 100
1 A 20 101
2 B 30 102
3 A 50 103
4 B 10 104
5 D 40 105
6 B 50 106
7 A 90 107
'''
要特别注意的是,需求为计算每行的提成金额。
先按品类分组后计算各品类的累计数量,并将这个数量进行分箱操作,不同区间标为对应的提成比例。
将各分组对应的提成转为字典用于原数据表的映射,这样就得到了每行数据对应的提成比例,最后金额与提成比例计算出提成金额。
先试算每个品类分组的累计数量:
df.groupby('品类').数量.sum()
'''
品类
A 160
B 90
C 10
D 40
Name: 数量, dtype: int64
'''
利用 pd.cut() 对以上各品类提成区间进行分箱:
m = pd.cut(df.groupby('品类').数量.sum(),
bins=[0, 40, 80, 100, float('inf')],
labels=[0.01, 0.02, 0.03, 0.05]
)
m
'''
品类
A 0.05
B 0.03
C 0.01
D 0.01
Name: 数量, dtype: category
Categories (4, float64): [0.01 < 0.02 < 0.03 < 0.05]
'''
m.to_dict()
# {'A': 0.05, 'B': 0.03, 'C': 0.01, 'D': 0.01}
以上我们将其转化为字典,未来用于映射操作。
最后,我们按品类映射提成比例,计算最终的提醒金额:
(
df.assign(提成比例=df.品类.map(m.to_dict()))
.assign(提成金额=lambda x: x.金额 * x.提成比例)
)
'''
品类 数量 金额 提成比例 提成金额
0 C 10 100 0.01 1.00
1 A 20 101 0.05 5.05
2 B 30 102 0.03 3.06
3 A 50 103 0.05 5.15
4 B 10 104 0.03 3.12
5 D 40 105 0.01 1.05
6 B 50 106 0.03 3.18
7 A 90 107 0.05 5.35
'''
这样,就完成了需求。
(完)
更新时间:Aug. 18, 2024, 3:59 p.m. 标签:pandas python 分组 金额