如何在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)
代码说明
groupby('id'):按id将数据分组,把同一id的多行归为一组。.max():对每组内的所有列取最大值。由于非对应年份的列值都是0,最大值自然就是该列的有效数据;Year列的最大值刚好是2022,符合需求。.reset_index():将分组后的id从索引恢复为普通列。
执行后输出与期望结果完全一致。
内容的提问来源于stack exchange,提问作者ggupta
相关产品推荐
相关产品推荐

