繁体   English   中英

获取每个 class pandas dataframe 的百分比

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM