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

使用Pandas wide_to_long实现下划线列名的宽表转长表求助

搞定Pandas宽表转长表的KeyError问题

嘿,我来帮你解决这个问题!你现在要把列名是u_i格式的宽表转成包含cat、u、i、mouse的长表,原代码报错KeyError,核心原因是pd.wide_to_long的参数用错了,而且没处理好原表的行索引(也就是目标表的cat列)。

我给你两种靠谱的实现方案,都能适配任意同格式的数据,先讲最通用的一种:

方案一:用melt+字符串拆分(推荐,适配所有同格式列名)

这种方法不需要提前知道u的取值范围,不管你的列是1_1还是100_200都能处理:

  1. 先把行索引转成cat列
    原表的行索引就是目标表的cat值,所以先把索引转成列:

    df = df.reset_index().rename(columns={'index': 'cat'})
    
  2. 将宽表转成初步长表
    用melt把所有u_i格式的列转成键值对:

    df_long = df.melt(id_vars='cat', var_name='u_i', value_name='mouse')
    

    这一步之后,表会有cat、u_i(原列名)、mouse(单元格值)三列。

  3. 拆分u_i列得到u和i
    按下划线拆分列名,转换成整数类型:

    df_long[['u', 'i']] = df_long['u_i'].str.split('_', expand=True).astype(int)
    
  4. 整理最终表结构
    删除多余的u_i列,调整列顺序到你需要的样子:

    df_final = df_long.drop(columns='u_i')[['cat', 'u', 'i', 'mouse']]
    

方案二:改进pd.wide_to_long的用法

如果你想用wide_to_long,得调整参数,处理好分隔符和索引列:

  1. 同样先把行索引转成cat列

    df = df.reset_index().rename(columns={'index': 'cat'})
    
  2. 调用wide_to_long并指定分隔符
    这里我们把所有列的数值部分作为mouse,用sep='_'指定列名的分隔符,suffix='\\d+'表示后缀是数字:

    df_long = pd.wide_to_long(df, stubnames='mouse', i='cat', j='u_i', sep='_', suffix='\\d+').reset_index()
    
  3. 拆分u_i列并整理结构
    和方案一的步骤一样,拆分后调整列顺序:

    df_long[['u', 'i']] = df_long['u_i'].str.split('_', expand=True).astype(int)
    df_final = df_long.drop(columns='u_i')[['cat', 'u', 'i', 'mouse']]
    

为什么你原来的代码报错?

你原来的代码里pd.wide_to_long(df, u_seq_stub, i='u', j='i')有两个问题:

  • i='u'指定了u作为索引列,但原表根本没有u列,所以抛出KeyError;
  • u_seq_stub的生成方式不对,wide_to_long需要的是列名的固定前缀,而你生成的是类似['1_', '2_']这样的字符串,不符合函数的参数要求。

内容的提问来源于stack exchange,提问作者sig5

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:45:59