![](/img/trans.png)
[英]using pandas groupby apply sum & count for two categorical columns based on another categorical column
[英]Apply pandas groupby, sum and mean based on another column
我正在处理数据框。 尝试根据另一列进行分组、求和和平均。 由于所有 3 个操作合而为一。 我找不到任何解决方案。 请帮忙
mydf = pd.DataFrame.from_records([{'Month-Year': 'Apr-2020',
'meets_target_str': 'Target Met',
'granularity_date': '2020-04-01',
'meets_target': 31,
'total' : 67,
'percentage':46.26},
{'Month-Year': 'Apr-2020',
'meets_target_str': 'Target not met',
'granularity_date': '2020-04-01',
'meets_target': 36,
'total' : 67,
'percentage':53.73},
{'Month-Year': 'May-2020',
'meets_target_str': 'Target not met',
'granularity_date': '2020-05-01',
'meets_target': 41,
'total' : 97,
'percentage':42.26},
{'Month-Year': 'May-2020',
'meets_target_str': 'Target Met',
'granularity_date': '2020-05-01',
'meets_target': 56,
'total' : 97,
'percentage':57.73},
{'Month-Year': 'Jun-2020',
'meets_target_str': 'Target not met',
'granularity_date': '2020-06-01',
'meets_target': 41,
'total' : 70,
'percentage':58.47},
{'Month-Year': 'Jun-2020',
'meets_target_str': 'Target Met',
'granularity_date': '2020-06-01',
'meets_target': 29,
'total' : 70,
'percentage':41.42
}])
mydf["total"] = mydf.groupby("granularity_date")["meets_target"].transform("sum")
mydf["percentage"] = mydf["meets_target"] / mydf["total"] * 100
Month-Year meets_target_str granularity_date meets_target total percentage
0 Apr-2020 Target Met 2020-04-01 31 67 46.268657
1 Apr-2020 Target not met 2020-04-01 36 67 53.731343
2 May-2020 Target not met 2020-05-01 41 97 42.268041
3 May-2020 Target Met 2020-05-01 56 97 57.731959
4 Jun-2020 Target not met 2020-06-01 41 70 58.571429
5 Jun-2020 Target Met 2020-06-01 29 70 41.428571
可选择使用.round
将百分比舍入到 2 位小数
您也可以像这样使用 eval 来获得单行代码:
mydf.assign(total=mydf.groupby(['Month-Year'])['meets_target'].transform('sum'))\
.eval('percentage=meets_target/total*100')
Output:
Month-Year meets_target_str granularity_date meets_target total percentage
0 Apr-2020 Target Met 2020-04-01 31 67 46.268657
1 Apr-2020 Target not met 2020-04-01 36 67 53.731343
2 May-2020 Target not met 2020-05-01 41 97 42.268041
3 May-2020 Target Met 2020-05-01 56 97 57.731959
4 Jun-2020 Target not met 2020-06-01 41 70 58.571429
5 Jun-2020 Target Met 2020-06-01 29 70 41.428571
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.