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

如何在Pandas中实现单行多记录的通用堆叠转换

Pandas 通用多行记录拆分方法

问题场景

你的DataFrame每行包含多组ID与对应属性值(例如id1/valueA1/valueB1为一组,id2/valueA2/valueB2为另一组),需要将这些组拆分为独立行,得到每个ID对应其valueA、valueB的结构。

通用解决方案

利用Pandas的wide_to_long函数实现,该方法支持任意数量的ID组和属性组,无需手动指定列数:

1. 构造示例数据

import pandas as pd
from collections import defaultdict

# 构造原始DataFrame
df = pd.DataFrame({
    'id1': [1, 2],
    'id2': [2, 1],
    'id3': [3, 3],
    'valueA1': ['X', 'P'],
    'valueA2': ['Y', 'Q'],
    'valueA3': ['Z', 'U'],
    'valueB1': ['A', 'S'],
    'valueB2': ['B', 'V'],
    'valueB3': ['C', 'M']
})

2. 自动识别列分组

# 按列名前缀分组,自动识别ID和属性列
col_groups = defaultdict(list)
for col in df.columns:
    # 分离前缀与数字后缀
    prefix = ''.join([c for c in col if not c.isdigit()])
    col_groups[prefix].append(col)

# 提取ID前缀和属性前缀
id_prefix = next(p for p in col_groups if p.startswith('id'))
value_prefixes = [p for p in col_groups if not p.startswith('id')]

3. 转换为目标结构

# 使用wide_to_long拆分宽表
result = pd.wide_to_long(
    df,
    stubnames=[id_prefix] + value_prefixes,
    i=df.index,  # 以原行索引作为分组依据
    j='suffix',  # 存储列名的数字后缀(可忽略)
    sep='',
    suffix=r'\d+'
).reset_index(drop=True)

# 调整列顺序为目标格式
result = result[['id'] + value_prefixes]

转换结果

idvalueAvalueB
1XA
2YB
3ZC
2PS
1QV
3UM

说明

  • 该方法自动适配任意数量的ID列(id1、id2...idN)和属性列(valueX1、valueX2...valueXN),无需修改代码。
  • wide_to_long会自动将同前缀的列按数字后缀匹配,拆分为对应行,保证ID与属性值的对应关系正确。

内容的提问来源于stack exchange,提问作者Ivor Denham-Dyson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 01:40:03