[英]get the percentage of each class pandas dataframe
我的 dataframe:
df = pd.DataFrame({'label':[0,0,1,1,2,2],"gender":['M','F','M','F','M','F'],'count':[100,200,150,210,300,220]})
我试过了:
df['percent'] = 100* df['count'] / df.groupby('label')['count'].sum()
但它只给出前 4 行仍然错误的值。
我需要一个基于 label 的名称percent
计数的列
Output:
label gender count percent
0 0 M 100 33
1 0 F 200 67
2 1 M 150 41
3 1 F 210 59
4 2 M 300 57
5 2 F 220 43
使用GroupBy.transform
为具有与原始列相同大小的 Series 重复聚合值,因此可以划分:
df['percent'] = 100* df['count'] / df.groupby('label')['count'].transform('sum')
print (df)
label gender count percent
0 0 M 100 33.333333
1 0 F 200 66.666667
2 1 M 150 41.666667
3 1 F 210 58.333333
4 2 M 300 57.692308
5 2 F 220 42.307692
详情:
print (df.groupby('label')['count'].transform('sum'))
0 300
1 300
2 360
3 360
4 520
5 520
Name: count, dtype: int64
另一种选择,虽然比transform
更详细,但使用map
:
mapping = df.label.map(df.groupby("label")["count"].sum())
df.assign(percent=df["count"].mul(100).div(mapping))
label gender count percent
0 0 M 100 33.333333
1 0 F 200 66.666667
2 1 M 150 41.666667
3 1 F 210 58.333333
4 2 M 300 57.692308
5 2 F 220 42.307692
另一种选择是使用set_index
/ reset_index
技巧。
d = df.set_index(['label', 'gender'])
d.mul(100).div(d.sum(level=0)).reset_index()
label gender count
0 0 M 33.333333
1 0 F 66.666667
2 1 M 41.666667
3 1 F 58.333333
4 2 M 57.692308
5 2 F 42.307692
对于字符串表示,您可以在此处使用 python 的mini string language
。
d = df.set_index(['label', 'gender'])
d.div(d.sum(level=0))['count'].map("{:%}".format).reset_index()
label gender count
0 0 M 33.333333%
1 0 F 66.666667%
2 1 M 41.666667%
3 1 F 58.333333%
4 2 M 57.692308%
5 2 F 42.307692%
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.