如何在DataFrame分组后统计数量与完成率百分比
问题:按name分组统计level类型数量及完成百分比
原始DataFrame数据如下:
import pandas as pd df = pd.DataFrame({ 'name': ['name1']*8 + ['name2']*2, 'level': ['TOP', 'NON-TOP', 'NON-TOP', 'TOP', 'TOP', 'NON-TOP', 'TOP', 'TOP', 'TOP', 'TOP'], 'finished': [1, 1, 1, 1, 0, 0, 0, 1, 1, 0] })
需求说明:
按name字段分组,统计每个name下TOP和NON-TOP的条目数量,同时计算finished字段的完成百分比(1代表完成,0代表未完成),最终输出如下格式的结果:
name top non_top finished(%) 0 name1 5 3 62.5 % 1 name2 2 0 50 %
解决方案
方法一:分步统计+结果合并
通过拆分统计任务,再合并最终结果:
# 1. 统计每个name下各level的数量,转换为列格式 level_stats = df.groupby(['name', 'level']).size().unstack(fill_value=0) level_stats = level_stats.rename(columns={'TOP': 'top', 'NON-TOP': 'non_top'}) # 2. 计算每个name的完成百分比,格式化显示 finished_stats = df.groupby('name')['finished'].apply( lambda x: f"{(x.mean() * 100):.1f} %" ).rename('finished(%)') # 3. 合并两个统计结果并重置索引 final_result = pd.concat([level_stats, finished_stats], axis=1).reset_index() print(final_result)
方法二:自定义聚合函数
通过自定义函数,在一次分组操作中完成所有指标计算:
def group_metrics(group): # 统计TOP和NON-TOP的数量 top_num = (group['level'] == 'TOP').sum() non_top_num = (group['level'] == 'NON-TOP').sum() # 计算完成百分比并格式化 pct = f"{(group['finished'].mean() * 100):.1f} %" return pd.Series([top_num, non_top_num, pct], index=['top', 'non_top', 'finished(%)']) # 分组应用自定义函数,重置索引得到最终结果 final_result = df.groupby('name').apply(group_metrics).reset_index() print(final_result)
两种方法都能得到符合要求的结果,方法一更直观易理解,方法二则更简洁,适合一次性处理多指标的场景。
内容的提问来源于stack exchange,提问作者user14073111
相关产品推荐
相关产品推荐

