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完全匹配预期结构:
| id | restaurant_d_amt_sum | health_d_amt_sum | fees_d_amt_sum |
|---|---|---|---|
| 1 | 28.0 | 20.0 | NaN |
| 2 | NaN | 20.0 | 13.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完全匹配预期结构:
| id | fees_c_amt_sum | restaurant_c_amt_sum | wage_c_amt_sum |
|---|---|---|---|
| 1 | 100.0 | 18.0 | NaN |
| 2 | 115.0 | NaN | 40.0 |
- 实现核心是用
groupby完成双维度分组聚合,再通过unstack()直接完成行到列的转置,不需要写循环逐类统计,运行效率高 - 聚合过程中Pandas会自动忽略NaN值,不存在对应分类的组合默认填充NaN,和需求规则完全一致
内容的提问来源于stack exchange,提问作者Danish
相关产品推荐
相关产品推荐

