我有一个数据集。
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 2017年7月的示例 离线百分比为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循环就可以完成,那就太好了
答案 0 :(得分:3)
如果每个Sales Channel
除以GroupBy.transform
和Year_Month
创建的Series
除唯一的sum
:
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