You need to enable JavaScript to run this app. 如何将长格式Pandas DataFrame按ID重塑为两种目标宽格式并拆分键值列?
优惠活动
大模型
产品
解决方案
定价
更多

如何将长格式Pandas DataFrame按ID重塑为两种目标宽格式并拆分键值列?

Pandas 长表转指定宽表格式实现方案

直接使用transpose无法满足需求的核心原因是:该方法仅实现现有DataFrame的维度翻转,不会基于ID字段做分组聚合,也不会将同一ID下的多行记录展开为单行多列的结构。两类预期输出本质属于长表转宽表的透视类需求,完全可以通过pandas内置的透视、分组聚合方法实现,同时可灵活控制列顺序满足不同排列要求。

前置数据准备

import pandas as pd
L1 = [['ID1', 0, 'key1a', 'value1a', 'pair1a'],
      ['ID1', 2, 'key1c', 'value1c', 'pair1c'],
      ['ID1', 1, 'key1b', 'value1b', 'pair1b'],
      ['ID2', 0, 'key2a', 'value2a', 'pair2a'],
      ['ID2', 1, 'key2b', 'value2b', 'pair2b'],
      ['ID2', 2, 'key2c', 'value2c', 'pair2c']
      ]
df1 = pd.DataFrame(L1,columns=['ID', 't', 'Key','Value', 'Pair'])

由于原始数据中同一ID下的行存在t字段乱序(比如ID1下t=2的行排在t=1的行前面),需要先按ID、t字段对数据做升序排序,保证后续展开的列顺序和预期匹配:

# 按ID分组、组内按t从小到大排序,重置索引避免顺序错位
df_sorted = df1.sort_values(['ID', 't']).reset_index(drop=True)

实现预期输出一

预期输出一的列排列逻辑是按字段类型聚类:先放置所有Key值列,再放置所有Value值列,最后放置所有Pair值列。
实现步骤:

  1. 分别对Key、Value、Pair三个字段做透视,以ID为行索引、t为列索引,将同一ID下的多行值展开为单行多列
  2. 按字段类型顺序拼接三个透视后的子集,形成连续的列区块
# 分三个维度透视展开
key_part = df_sorted.pivot(index='ID', columns='t', values='Key')
value_part = df_sorted.pivot(index='ID', columns='t', values='Value')
pair_part = df_sorted.pivot(index='ID', columns='t', values='Pair')

# 按字段类型顺序拼接,形成Key列、Value列、Pair列连续排列的结构
df_output1 = pd.concat([key_part, value_part, pair_part], axis=1)
# 将行索引的ID值变回普通列,匹配输出格式
df_output1 = df_output1.reset_index()

生成的输出结构完全匹配预期一的排列:

  • 第一列为ID值(ID1、ID2)
  • 后续连续3列为每个ID下按顺序排列的key值
  • 再后续连续3列为对应位置的value值
  • 最后连续3列为对应位置的pair值

实现预期输出二

预期输出二的列排列逻辑是按单条记录维度聚类:每一组Key-Value-Pair连续排列,而非按字段类型聚类。
实现时仅需要调整子集拼接的顺序,不需要修改透视的核心逻辑:

# 逐列位置拼接三个字段的值,形成Key-Value-Pair连续排列的结构
df_output2 = pd.concat(
    [key_part[t], value_part[t], pair_part[t]] for t in key_part.columns
    , axis=1
).reset_index()

生成的输出结构完全匹配预期二的排列:

  • 第一列为ID值(ID1、ID2)
  • 后续每三列组成一组,依次为对应位置的key、value、pair值,按t的顺序逐组排列

关于key、value拆分为独立列的说明

两类输出结构天然实现了key、value值的独立拆分:

  • 透视生成的新DataFrame中,每个展开后的列仅存储原表对应位置的单一值,不存在多值混合的情况
  • 后续处理时可通过简单的规则快速筛选不同类型的列,实现独立操作:
    • 筛选所有Key类列:通过判断列值前缀是否为key快速定位
    • 筛选所有Value类列:通过判断列值前缀是否为value快速定位
    • 筛选所有Pair类列:通过判断列值前缀是否为pair快速定位

如果需要进一步提升列的可维护性,可以在透视阶段为生成的列加上明确的字段前缀(比如将列名设置为key_t0、value_t0),降低后续单独处理不同类型列的成本。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 11:15:04