如何按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)
代码说明
- 生成组内序号:用
groupby('id').cumcount()统计每个ID下的行索引,加1后得到1、2、3的序号,用来区分同一ID的不同行。 - 转宽表:
pivot方法将每个ID下的多行数据转为列,此时会生成多层列索引(上层是code/amount,下层是序号)。 - 合并列名:通过
map将多层列名拼接成code1、amount1的格式。 - 调整列顺序:重新排列列的顺序,确保
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
相关产品推荐
相关产品推荐

