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

如何按ID分组合并Pandas DataFrame,将多行转为多列?

Pandas实现按ID聚合多行转单行

针对你给出的DataFrame,要实现每个ID仅占一行的格式,可以通过生成组内序号+转宽表的方式完成,具体步骤如下:

完整实现代码

import pandas as pd

# 原始数据
dat = pd.DataFrame({'id':[1,1,1,2,2,3,4,4], 'code': ["A","B","D","B","D","A","A","D"], 'amount':[11,2,5,22,5,32,11,5]})

# 1. 为每个ID下的行生成序号(从1开始,对应目标中的1/2/3后缀)
dat['seq'] = dat.groupby('id').cumcount() + 1

# 2. 将行转成列,以id为索引,seq为列分组,值为code和amount
pivoted = dat.pivot(index='id', columns='seq', values=['code', 'amount'])

# 3. 合并多层列名,生成code1、amount1这类格式
pivoted.columns = pivoted.columns.map(lambda x: f"{x[0]}{x[1]}")

# 4. 重置索引,把id从索引转为普通列
result = pivoted.reset_index()

# 5. 调整列顺序,匹配目标格式的code1/amount1交替排列
col_order = ['id'] + [f'{col}{i}' for i in range(1,4) for col in ['code', 'amount']]
result = result[col_order]

# 查看结果
print(result)

代码说明

  1. 生成组内序号:用groupby('id').cumcount()统计每个ID下的行索引,加1后得到1、2、3的序号,用来区分同一ID的不同行。
  2. 转宽表:pivot方法将每个ID下的多行数据转为列,此时会生成多层列索引(上层是code/amount,下层是序号)。
  3. 合并列名:通过map将多层列名拼接成code1、amount1的格式。
  4. 调整列顺序:重新排列列的顺序,确保code和amount按序号交替出现,和目标格式完全匹配。

运行后输出结果如下:

id code1 amount1 code2 amount2 code3 amount3
0   1     A      11     B       2     D       5
1   2     B      22     D       5   NaN     NaN
2   3     A      32   NaN     NaN   NaN     NaN
3   4     A      11     D       5   NaN     NaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:50:20