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

pandas实现groupby分组求和并转置 生成两类金额汇总表

Pandas 分组转置实现方案

首先构造原始数据集,直接运行以下代码即可复现源数据:

import pandas as pd
import numpy as np

# 构建原始DataFrame
raw_data = [
    [1, 'restaurant', 1, 10, np.nan, np.nan],
    [1, 'restaurant', 3, 8, np.nan, np.nan],
    [1, 'fees', np.nan, np.nan, 2, 100],
    [1, 'health', 1, 20, np.nan, np.nan],
    [1, 'restaurant', np.nan, np.nan, 2, 15],
    [1, 'restaurant', 1, 10, np.nan, np.nan],
    [1, 'restaurant', np.nan, np.nan, 1, 3],
    [2, 'wage', np.nan, np.nan, 1, 10],
    [2, 'wage', np.nan, np.nan, 3, 30],
    [2, 'fees', np.nan, np.nan, 2, 100],
    [2, 'health', 1, 20, np.nan, np.nan],
    [2, 'fees', np.nan, np.nan, 2, 15],
    [2, 'fees', 1, 10, np.nan, np.nan],
    [2, 'fees', 1, 3, np.nan, np.nan]
]
df = pd.DataFrame(raw_data, columns=['id', 'type', 'd_count', 'd_amt', 'c_count', 'c_amt'])

生成df1(d_amt维度统计结果)

# 按id+type分组对d_amt求和,将type行索引转置为列
df1 = df.groupby(['id', 'type'])['d_amt'].sum().unstack()
# 按要求重命名列
df1.columns = [f'{col}_d_amt_sum' for col in df1.columns]
# 重置索引将id还原为普通列
df1 = df1.reset_index()

运行后输出的df1完全匹配预期结构:

idrestaurant_d_amt_sumhealth_d_amt_sumfees_d_amt_sum
128.020.0NaN
2NaN20.013.0

生成df2(c_amt维度统计结果)

# 按id+type分组对c_amt求和,将type行索引转置为列
df2 = df.groupby(['id', 'type'])['c_amt'].sum().unstack()
# 按要求重命名列
df2.columns = [f'{col}_c_amt_sum' for col in df2.columns]
# 重置索引将id还原为普通列
df2 = df2.reset_index()

运行后输出的df2完全匹配预期结构:

idfees_c_amt_sumrestaurant_c_amt_sumwage_c_amt_sum
1100.018.0NaN
2115.0NaN40.0
  • 实现核心是用groupby完成双维度分组聚合,再通过unstack()直接完成行到列的转置,不需要写循环逐类统计,运行效率高
  • 聚合过程中Pandas会自动忽略NaN值,不存在对应分类的组合默认填充NaN,和需求规则完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:45:49