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

如何在Pandas DataFrame中合并同一ID的多行列值至单行

Pandas按ID合并多行年份数据解决方案

需求说明

现有Pandas DataFrame,其中CY对应2022年(当年)、PY对应2021年(上年)、PPY对应2020年(前年),需将同一id的多行数据合并为单行,把对应年份的列值填充到正确位置。

输入DataFrame

id  Year    Jan_CY  Feb_CY  Jan_PY  Feb_PY  Jan_PPY Feb_PPY
1   2022    1       2       0       0       0       0
1   2021    0       0       3       4       0       0
1   2020    0       0       0       0       5       6
2   2022    0       0       0       0       0       0
2   2021    0       0       7       8       0       0
2   2020    0       0       0       0       9       10

期望输出DataFrame

id  Year    Jan_CY  Feb_CY  Jan_PY  Feb_PY  Jan_PPY Feb_PPY
1   2022    1       2       3       4       5       6
2   2022    0       0       7       8       9       10

原代码问题分析

你尝试的自定义函数逻辑混乱:既没有按id分组处理,mask方法的使用也未针对合并需求设计,无法提取不同年份行的有效数据并合并。

可行解决方案

核心思路:同一id下,各年份的有效数据仅出现在对应行的指定列中,其余为0。因此按id分组后,对每列取最大值(或求和)即可提取有效数据,同时Year列取最大值即为2022年。

简洁实现代码

import pandas as pd

# 构造输入数据(若已有DataFrame可跳过此步)
data = {
    'id': [1,1,1,2,2,2],
    'Year': [2022,2021,2020,2022,2021,2020],
    'Jan_CY': [1,0,0,0,0,0],
    'Feb_CY': [2,0,0,0,0,0],
    'Jan_PY': [0,3,0,0,7,0],
    'Feb_PY': [0,4,0,0,8,0],
    'Jan_PPY': [0,0,5,0,0,9],
    'Feb_PPY': [0,0,6,0,0,10]
}
df = pd.DataFrame(data)

# 分组合并
result = df.groupby('id').max().reset_index()

print(result)

代码说明

  1. groupby('id'):按id将数据分组,把同一id的多行归为一组。
  2. .max():对每组内的所有列取最大值。由于非对应年份的列值都是0,最大值自然就是该列的有效数据;Year列的最大值刚好是2022,符合需求。
  3. .reset_index():将分组后的id从索引恢复为普通列。

执行后输出与期望结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:02:11