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

如何重塑含重复列名的DataFrame?求适用的pandas函数

Pandas实现重复列名的宽表转长表

你需要的是将带有重复列名(多组x、y)的宽表转换为每一组x和y对应一行的长表,**pd.wide_to_long()**是最适合这个需求的函数,比单纯的melt()或stack()更精准,因为它能识别同前缀的列组并保持x与y的对应关系。

具体步骤:

  1. 处理重复列名: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']
    
  2. 使用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()
    

转换后结果:

后元音xy
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:50:30