Python数据框按列分组并创建具有百分比的新列

时间:2018-01-28 17:29:26

标签: python pandas percentage pandas-groupby

我有一个模拟数据框的场景,如下所示:

    Month  Amount  
1   Jan     260
2   Feb    179
3   Mar    153
4   Apr    142
5   May    128
6   Jun    116
7   Jul    71
8   Aug    56
9   Sep    49
10  Oct    17
11  Nov    0
12  Dec    0

我正在尝试通过使用数据帧组计算每行的百分比来获取新列,并使用lambda函数,如下所示:

 df = pd.DataFrame(mylistofdict)
 df = df.groupby('Month')["Amount"].apply(lambda x: x / x.sum()*100)

但是我没有得到预期结果只有2列:

    Month   Percentage
1   Jan         22%
2   Feb         15%
3   Mar         13%
4   Apr         12%
5   May         11%
6   Jun         10%
7   Jul         6%
8   Aug         5%
9   Sep         4%
10  Oct         1%
11  Nov         0
12  Dec         0

如何修改我的代码,或者有什么比使用数据框更好。

1 个答案:

答案 0 :(得分:2)

如果Month的值是唯一使用:

df['perc'] = df["Amount"] / df["Amount"].sum() * 100
print (df)
   Month  Amount       perc
1    Jan     260  22.203245
2    Feb     179  15.286080
3    Mar     153  13.065756
4    Apr     142  12.126388
5    May     128  10.930828
6    Jun     116   9.906063
7    Jul      71   6.063194
8    Aug      56   4.782237
9    Sep      49   4.184458
10   Oct      17   1.451751
11   Nov       0   0.000000
12   Dec       0   0.000000

如果Month的值重复,我相信可以使用:

print (df)
   Month  Amount
1    Jan     260
1    Jan     100
3    Mar     153
4    Apr     142
5    May     128
6    Jun     116
7    Jul      71
8    Aug      56
9    Sep      49
10   Oct      17
11   Nov       0
12   Dec       0


df = df.groupby('Month', as_index=False, sort=False)["Amount"].sum()
df['perc'] = df["Amount"] / df["Amount"].sum() * 100
print (df)
   Month  Amount       perc
0    Jan     360  32.967033
1    Mar     153  14.010989
2    Apr     142  13.003663
3    May     128  11.721612
4    Jun     116  10.622711
5    Jul      71   6.501832
6    Aug      56   5.128205
7    Sep      49   4.487179
8    Oct      17   1.556777
9    Nov       0   0.000000
10   Dec       0   0.000000