Python Pandas - 在Groupby DF上将列转换为百分比

Sco*_*tEU 3 python pandas

我有一个由groupby创建的数据框:

hmdf = pd.DataFrame(hm01)
new_hm01 = hmdf[['FinancialYear','Month','FirstReceivedDate']]

hm05 = new_hm01.pivot_table(index=['FinancialYear','Month'], aggfunc='count')
vals1 = ['April    ', 'May      ', 'June     ', 'July     ', 'August   ', 'September', 'October  ', 'November ', 'December ', 'January  ', 'February ', 'March    ']

df_hm = new_hm01.groupby(['Month', 'FinancialYear']).size().unstack(fill_value=0).rename(columns=lambda x: '{}'.format(x))
df_hml = df_hm.reindex(vals1)
Run Code Online (Sandbox Code Playgroud)

DF看起来像这样:

FinancialYear   2014/2015   2015/2016   2016/2017   2017/2018
Month               
April               34          24          22          20
May                 29          26          21          25
June                19          39          22          20
July                23          39          18          20
August              36          30          34           0
September           35          23          41           0
October             36          37          27           0
November            38          31          30           0
December            36          41          23           0
January             34          30          35           0
February            37          26          37           0
March               36          31          33           0
Run Code Online (Sandbox Code Playgroud)

列名来自变量(threeYr,twoYr,oneYr,Yr),我想转换数据帧,以便数字是每列总数的百分比,但我不能让它工作.

这就是我要的:

FinancialYear       2014/2015   2015/2016   2016/2017   2017/2018
Month               
April                   9%          6%          6%         24%
May                     7%          7%          6%         29%
June                    5%         10%          6%         24%
July                    6%         10%          5%         24%
August                  9%          8%         10%          0%
September               9%          6%         12%          0%
October                 9%         10%          8%          0%
November               10%          8%          9%          0%
December                9%         11%          7%          0%
January                 9%          8%         10%          0%
February                9%          7%         11%          0%
March                   9%          8%         10%          0%
Run Code Online (Sandbox Code Playgroud)

有人可以帮我这么做吗?

编辑:我尝试了在这个链接上找到的响应:pandas将列转换为总数的百分比 .....我无法让它为我的数据帧工作+它不能很好地解释(对我来说)如何让它工作任何DF.我认为John Galt的反应比回应更好(我的观点).

Zer*_*ero 10

这是一种方式

In [1371]: (100. * df / df.sum()).round(0)
Out[1371]:
               2014/2015  2015/2016  2016/2017  2017/2018
FinancialYear
April                9.0        6.0        6.0       24.0
May                  7.0        7.0        6.0       29.0
June                 5.0       10.0        6.0       24.0
July                 6.0       10.0        5.0       24.0
August               9.0        8.0       10.0        0.0
September            9.0        6.0       12.0        0.0
October              9.0       10.0        8.0        0.0
November            10.0        8.0        9.0        0.0
December             9.0       11.0        7.0        0.0
January              9.0        8.0       10.0        0.0
February             9.0        7.0       11.0        0.0
March                9.0        8.0       10.0        0.0
Run Code Online (Sandbox Code Playgroud)

并且,如果你想要舍入到1位小数,值为'%'的字符串

In [1375]: (100. * df / df.sum()).round(1).astype(str) + '%'
Out[1375]:
              2014/2015 2015/2016 2016/2017 2017/2018
FinancialYear
April              8.7%      6.4%      6.4%     23.5%
May                7.4%      6.9%      6.1%     29.4%
June               4.8%     10.3%      6.4%     23.5%
July               5.9%     10.3%      5.2%     23.5%
August             9.2%      8.0%      9.9%      0.0%
September          8.9%      6.1%     12.0%      0.0%
October            9.2%      9.8%      7.9%      0.0%
November           9.7%      8.2%      8.7%      0.0%
December           9.2%     10.9%      6.7%      0.0%
January            8.7%      8.0%     10.2%      0.0%
February           9.4%      6.9%     10.8%      0.0%
March              9.2%      8.2%      9.6%      0.0%
Run Code Online (Sandbox Code Playgroud)