计算每个类别的贡献

时间:2019-05-21 11:56:31

标签: python pandas

我有一个数据集。

  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循环就可以完成,那就太好了

1 个答案:

答案 0 :(得分:3)

如果每个Sales Channel除以GroupBy.transformYear_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