繁体   English   中英

基于另一列应用 pandas groupby、sum 和 mean

[英]Apply pandas groupby, sum and mean based on another column

我正在处理数据框。 尝试根据另一列进行分组、求和和平均。 由于所有 3 个操作合而为一。 我找不到任何解决方案。 请帮忙

在此处输入图像描述

预计 Output: 在此处输入图像描述

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.

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