
本文介绍使用 Pandas 将按组(如 Group1/Group2/Group3)纵向排列的数据,按 Column2 值对齐、横向展开为宽表结构的方法,并同步映射 Column3 的对应值,适用于多组等长/不等长的结构化转换场景。
本文介绍使用 pandas 将按组(如 group1/group2/group3)纵向排列的数据,按 `column2` 值对齐、横向展开为宽表结构的方法,并同步映射 `column3` 的对应值,适用于多组等长/不等长的结构化转换场景。
在数据分析中,常需将“长格式”分组数据(即每组多行)转换为“宽格式”(即每组一列),尤其当各组具有相同语义维度(如 Value1, Value2…)但实际行数可能不一致时。Pandas 提供了灵活的 pivot 机制,配合辅助索引可精准实现对齐。
核心思路是:为每组内各行生成统一的顺序编号(如 Value1→0, Value2→1),再以此编号为新索引进行透视。这样可确保不同组中相同逻辑位置(如第1个值)对齐到同一行。
以下是完整、可复现的解决方案:
import pandas as pd
# 构建示例数据
df = pd.DataFrame({
'Column1': ['Group1']*4 + ['Group2']*4 + ['Group3']*2,
'Column2': ['Value1','Value2','Value3','Value4'] * 2 + ['Value1','Value2'],
'Column3': ['V1','V2','V3','V4','x1','x2','x3','x4','y1','y2']
})
# 步骤1:为每组内行添加递增序号(关键!)
tmp = df.assign(cc=df.groupby('Column1').cumcount())
# 步骤2:分别对 Column2 和 Column3 进行 pivot
col2_pivot = tmp.pivot(index='cc', columns='Column1', values='Column2')
col3_pivot = tmp.pivot(index='cc', columns='Column1', values='Column3').add_prefix('Column3.')
# 步骤3:水平拼接,并清除轴名称
out = pd.concat([col2_pivot, col3_pivot], axis=1).rename_axis(index=None, columns=None)
print(out)输出结果:
Group1 Group2 Group3 Column3.Group1 Column3.Group2 Column3.Group3 0 Value1 Value1 Value1 V1 x1 y1 1 Value2 Value2 Value2 V2 x2 y2 2 Value3 Value3 NaN V3 x3 NaN 3 Value4 Value4 NaN V4 x4 NaN
✅ 关键说明:
- groupby('Column1').cumcount() 为每个组内行生成从 0 开始的连续整数,作为对齐基准(cc 列);
- pivot(index='cc', columns='Column1', values=...) 将 cc 作为新行索引,Column1 作为新列名,values 填入对应单元格;
- add_prefix() 用于区分不同来源列,避免列名冲突;
- rename_axis(..., columns=None) 移除列层级名称,使输出更简洁。
⚠️ 注意事项:
- 若原始数据中 Column2 值不具唯一性或顺序混乱,建议先按 Column1 和业务逻辑(如 Column2 字典序或自定义映射)排序,再执行 cumcount();
- pivot 遇到重复 (index, columns) 组合会报错,确保 cc 与 Column1 的组合唯一(本方案天然满足);
- 若需填充缺失值(如 NaN 替换为 'N/A'),可在最后调用 .fillna('N/A')。
该方法高效、可扩展,适用于任意数量的分组(如 Group1 至 Group100),无需硬编码,是 Pandas 宽表转换的经典范式。

















