[英]How to calculate percentage in groupby in Python
我有一个看起来像这样的数据框:
DATE SCHEDULED ARTICLE_CODE
2021-10-01 2 001
2021-10-01 2 002
2021-10-01 2 003
2021-11-01 2 001
2021-11-01 2 002
2021-11-01 2 003
2021-11-01 2 004
...
我想要的是获得每个日期的每篇文章代码的预定百分比
我想得到的是:
DATE SCHEDULED ARTICLE_CODE PERCENTAGE
2021-10-01 2 001 33.3
2021-10-01 2 002 33.3
2021-10-01 2 003 33.3
2021-11-01 2 001 25
2021-11-01 2 002 25
2021-11-01 2 003 25
2021-11-01 2 004 25
...
我认为使用 groupby 是可行的,但我无法做到
使用Series.value_counts
和Series.map
作为计数列,从右侧除以100
除以Series.rdiv
:
df['PERCENTAGE'] = df['DATE'].map(df['DATE'].value_counts()).rdiv(100).round(1)
print (df)
DATE SCHEDULED ARTICLE_CODE PERCENTAGE
0 2021-10-01 2 1 33.3
1 2021-10-01 2 2 33.3
2 2021-10-01 2 3 33.3
3 2021-11-01 2 1 25.0
4 2021-11-01 2 2 25.0
5 2021-11-01 2 3 25.0
6 2021-11-01 2 4 25.0
另一个想法:
df['PERCENTAGE'] = (100 / df.groupby('DATE')['ARTICLE_CODE'].transform('size')).round(1)
df['PERCENTAGE'] = df.groupby('DATE')['ARTICLE_CODE'].apply(lambda x: x*100/(x*len(x)))
这是pd.crosstab
的一种方法-
df['PERCENTAGE'] = pd.crosstab(df['DATE'], df['ARTICLE_CODE'], normalize='index').stack().where(lambda x: x>0).dropna().round(2).reset_index()[0]
输出
DATE SCHEDULED ARTICLE_CODE PERCENTAGE
0 2021-10-01 2 1 0.33
1 2021-10-01 2 2 0.33
2 2021-10-01 2 3 0.33
3 2021-11-01 2 1 0.25
4 2021-11-01 2 2 0.25
5 2021-11-01 2 3 0.25
6 2021-11-01 2 4 0.25
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.