如何在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]
转换结果
| id | valueA | valueB |
|---|---|---|
| 1 | X | A |
| 2 | Y | B |
| 3 | Z | C |
| 2 | P | S |
| 1 | Q | V |
| 3 | U | M |
说明
- 该方法自动适配任意数量的ID列(
id1、id2...idN)和属性列(valueX1、valueX2...valueXN),无需修改代码。 wide_to_long会自动将同前缀的列按数字后缀匹配,拆分为对应行,保证ID与属性值的对应关系正确。
内容的提问来源于stack exchange,提问作者Ivor Denham-Dyson
相关产品推荐
相关产品推荐

