Pandas宽表转换:保留重复id与原始数据顺序的实现方案
解决方案
你可以通过添加一个分组序号辅助列来解决这个问题,这样就能在不聚合的情况下完成宽表转换,同时保留原始顺序:
步骤1:添加分组序号
先给每个id下的每一组a/b对标记序号,确保pivot时索引唯一:
import pandas as pd df = pd.DataFrame({ "id": [1, 1, 1, 1, 2, 2, 2, 2], "column": ["a", "b","a", "b", "a", "b", "a", "b"], "value": [1, 7, 6, 5, 4, 3, 1, 7] }) # 给每个id下的每2行(a/b对)分配同一个序号 df['group_num'] = df.groupby('id').cumcount() // 2
步骤2:执行pivot转换
用pivot方法,以id和group_num作为复合索引,避免聚合:
pivoted_df = df.pivot(index=['id', 'group_num'], columns='column', values='value')
步骤3:整理结果
重命名列名并重置索引,得到目标结构:
# 重命名列,加上value_前缀 pivoted_df = pivoted_df.rename(columns={'a': 'value_a', 'b': 'value_b'}).reset_index(drop=['group_num']) print(pivoted_df)
运行后输出结果:
id value_a value_b 0 1 1 7 1 1 6 5 2 2 4 3 3 2 1 7
这个方法的核心是用辅助列区分同一id下的不同数据组,让pivot操作有唯一的索引键,从而避免自动聚合,同时完全保留原始数据的顺序。
内容的提问来源于stack exchange,提问作者Nikola
相关产品推荐
相关产品推荐

