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

Pandas如何实现id为行name为列、统计result求和带总计的DataFrame

最简实现方案

直接使用pandas内置的透视表或分组反堆叠逻辑,一步完成聚合+长表转宽表操作,不需要额外做结构转换,自动兼容不同id对应name取值不一致的场景。

推荐写法(可读性最高)

import pandas as pd

# 聚合生成宽表结构
df_summary = pd.pivot_table(
    df,
    values="result",
    index="id",       # 行使用id列唯一值
    columns="name",   # 列展开为name的所有取值
    aggfunc="sum",    # 对result布尔值求和,统计True的数量
    fill_value=0      # 不存在的(id,name)组合自动填充0
)

# 末尾新增total列,统计每行总和
df_summary["total"] = df_summary.sum(axis=1)

精简写法(代码更短)

习惯groupby语法的话,可以用分组后反堆叠的方式实现,效果完全一致:

df_summary = df.groupby(['id', 'name'])['result'].sum().unstack(fill_value=0)
df_summary["total"] = df_summary.sum(axis=1)

逻辑说明

  • 两种写法都会自动将id的去重值设为行索引,name的去重值设为列名,单元格值为对应(id, name)组合下result的求和结果。pandas会默认将布尔值True按1计算、False按0计算,求和结果正好是该组合下True的计数,完全匹配需求。
  • 传入fill_value=0后,即使后续数据中不同id对应的name集合不一致,缺失的组合也会自动填充0,不会出现空值或列计算错误。

原有写法问题

之前执行df.groupby(['id', 'name'])['result'].sum()得到的是带多级索引的长格式Series,直接转DataFrame后依然保留长表结构,没有将name的取值展开为独立列,因此无法得到预期的宽表效果。

内容的提问来源于stack exchange,提问作者DM71

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:36:23