You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:05:31