如何重塑含重复列名的DataFrame?求适用的pandas函数
Pandas实现重复列名的宽表转长表
你需要的是将带有重复列名(多组x、y)的宽表转换为每一组x和y对应一行的长表,**pd.wide_to_long()**是最适合这个需求的函数,比单纯的melt()或stack()更精准,因为它能识别同前缀的列组并保持x与y的对应关系。
具体步骤:
处理重复列名:Pandas读取重复列名时会自动添加
.1、.2后缀,先将这些后缀改为下划线加序号(方便wide_to_long识别):import pandas as pd # 假设读取后的原始DataFrame df = pd.DataFrame({ '后元音': ['a:', 'o:'], 'x': [-26.69, '...'], 'x.1': [-40.06, '...'], 'x.2': [-49.59, '...'], 'y': [-15.56, '...'], 'y.1': [-7.5, '...'], 'y.2': [-11.89, '...'] }) # 重命名列,将后缀改为_1、_2、_3 df.columns = ['后元音', 'x_1', 'x_2', 'x_3', 'y_1', 'y_2', 'y_3']使用
wide_to_long转换表结构:# 转换宽表为长表,stubnames指定前缀列,i指定索引列,j指定分组标识 result = pd.wide_to_long( df, stubnames=['x', 'y'], # 要转换的列前缀 i='后元音', # 保留的索引列 j='group', # 临时分组列名 sep='_' # 列名中前缀与序号的分隔符 ).reset_index(drop=True, level='group').reset_index()
转换后结果:
| 后元音 | x | y |
|---|---|---|
| a: | -26.69 | -15.56 |
| a: | -40.06 | -7.5 |
| a: | -49.59 | -11.89 |
| o: | ... | ... |
为什么之前的方法没生效?
melt():默认会把所有x、y列合并成一列,无法保留x与y的组对应关系;stack():会将所有列转为行,但同样无法精准匹配同组的x和y;pivot_table():是长表转宽表的工具,与需求方向相反。
内容的提问来源于stack exchange,提问作者Elena
相关产品推荐
相关产品推荐

