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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:47:32