我有一个数据集。
Sales Channel Year_Month Total Cost
Offline Jul-2017 100
Online Jul-2017 200
Offline Aug-2017 300
Online Aug-2017 400
Online Sep-2017 200
Online Oct-2017 300
Online Nov-2017 100
Offline Nov-2017 3200
Online Dec-2017 500
我想根据 year_month 找到每个类别的百分比贡献。 year_month Jul-2017 示例 离线百分比为 100/(100 + 200) 在线百分比为 200(100 + 200)
所以输出应该是这样的:
Sales Channel Year_Month Total Cost Percentage
Offline Jul-2017 100 33.33%
Online Jul-2017 200 66.67%
Offline Aug-2017 300 60%
Online Aug-2017 200 40%
Online Sep-2017 200 100%
Online Oct-2017 300 100%
Online Nov-2017 100 20%
Offline Nov-2017 400 80%
Online Dec-2017 500 100%
我尝试遍历 year_month 然后计算每个类别。但是,它没有成功。
我有什么办法可以做到这一点。如果不用for循环也能搞定就好了
最佳答案
如果每个 Year_Month
有唯一的 Sales Channel
除以由 GroupBy.transform
创建的 Series
和总和
:
s = df.groupby('Year_Month')['Total Cost'].transform('sum')
df['Percentage'] = df['Total Cost'].div(s).mul(100)
print (df)
Sales Channel Year_Month Total Cost Percentage
0 Offline Jul-2017 100 33.333333
1 Online Jul-2017 200 66.666667
2 Offline Aug-2017 300 42.857143
3 Online Aug-2017 400 57.142857
4 Online Sep-2017 200 100.000000
5 Online Oct-2017 300 100.000000
6 Online Nov-2017 100 3.030303
7 Offline Nov-2017 3200 96.969697
8 Online Dec-2017 500 100.000000
另一种解决方案,如果 DataFrame 较大且组数较多,则速度较慢:
df['Percentage'] = df.groupby('Year_Month')['Total Cost'].apply(lambda x: x / x.sum()) * 100
关于python - 计算每个类别的贡献,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56237772/