如何对pandas DataFrame执行透视转置得到指定列顺序的结果表
pandas 按分组合并行实现宽表转换
原始数据构造
已有如下结构的DataFrame:
import pandas as pd df = pd.DataFrame({'fk ID': [1,1,2,2], 'value': [3,3,4,5], 'valID': [1,2,1,2]})
原始数据打印效果:
fk ID value valID 0 1 3 1 1 1 3 2 2 2 4 1 3 2 5 2
需求说明
需要将同fk ID下的两行数据合并为一行,最终得到每行包含同一个fk ID对应的valID=1和valID=2的全部字段,目标结构如下:
| fk ID | value | valID | fk ID | value | valID |
|---|---|---|---|---|---|
| 1 | 3 | 1 | 1 | 3 | 2 |
| 2 | 4 | 1 | 2 | 5 | 2 |
实现代码
固定每组2行场景的极简实现
# 拆分两组数据后按列拼接 df1 = df[df['valID'] == 1].reset_index(drop=True) df2 = df[df['valID'] == 2].reset_index(drop=True) res = pd.concat([df1, df2], axis=1)
通用实现(支持每组超过2行的场景)
# 给同fk ID下的行生成组内序号 df['group_seq'] = df.groupby('fk ID').cumcount() # 透视转换为宽表 res = df.set_index(['fk ID', 'group_seq']).unstack().sort_index(axis=1, level=1) # 展平多层列名,若不需要区分后缀可直接设置为重复列名 res.columns = [col[0] for col in res.columns] # 重置索引得到最终结果 res = res.reset_index()
注意事项
pandas默认不推荐使用重复列名,后续如果要按列名操作数据可能会出现异常,若仅用于展示可保留重复列名,建议给第二组列加后缀区分:
# 带后缀的列名设置示例 res.columns = [f"{col[0]}_{col[1]+1}" for col in res.columns]
内容的提问来源于stack exchange,提问作者freak11
相关产品推荐
相关产品推荐

