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

使用Pandas wide_to_long遇TypeError: expected string or buffer报错求助

使用pandas.wide_to_long重构DataFrame时报错的解决方法

问题重现

原始DataFrame结构(含更多类似math_b、reading_c的列):

Course Code   StudentID   score-reading_a   letter-reading_a   score-math_a   letter-math_a
ABC123        123456      98                A                  96             A
ABC123        987654      77                C                  88             B
DEF456        102938      88                B                  99             A

期望转换后的结构:

Course Code   Student ID   subject   score   letter
ABC123        123456       reading_a 98      A
ABC123        123456       math_a    96      A
ABC123        987654       reading_a 77      C
ABC123        987654       math_a    88      B
DEF456        102938       reading_a 88      B
DEF456        102938       math_a    99      A

执行以下代码时报错:

df['index'] = df.index
df_out = pd.wide_to_long(df, stubnames=['score', 'letter'], i='index', j='subject', sep='-')

报错信息:

TypeError: expected string or buffer

此前错误的列名赋值方式:

headers = ['Course Code', 'Student ID', 'score-reading_a', 'letter-reading_a',
           'score-math_a', 'letter-math_b']

df.columns = [headers]

报错原因

错误的列名赋值df.columns = [headers]会将DataFrame的列名设置为嵌套列表(或MultiIndex),而非普通的字符串数组。wide_to_long需要遍历字符串类型的列名进行匹配,非字符串的列对象会触发类型错误。后续尝试转换列名时的操作也因列名结构异常导致混乱或空结果。

解决步骤

1. 修正列名赋值方式

去掉方括号,直接将列表赋值给df.columns,确保列名是普通字符串:

headers = ['Course Code', 'Student ID', 'score-reading_a', 'letter-reading_a',
           'score-math_a', 'letter-math_a']

df.columns = headers

2. 正确使用wide_to_long

无需手动添加index列,直接用Course Code和Student ID作为唯一标识的分组键(i参数),这两个字段的组合可以唯一确定原始DataFrame中的每一行:

import pandas as pd

# 构造测试数据
data = [
    ['ABC123', 123456, 98, 'A', 96, 'A'],
    ['ABC123', 987654, 77, 'C', 88, 'B'],
    ['DEF456', 102938, 88, 'B', 99, 'A']
]
headers = ['Course Code', 'Student ID', 'score-reading_a', 'letter-reading_a',
           'score-math_a', 'letter-math_a']
df = pd.DataFrame(data, columns=headers)

# 使用wide_to_long转换
df_out = pd.wide_to_long(
    df,
    stubnames=['score', 'letter'],
    i=['Course Code', 'Student ID'],  # 用原始标识列作为分组键
    j='subject',
    sep='-'
).reset_index()  # 重置索引得到期望的扁平结构

执行后即可得到目标格式的DataFrame:

Course Code  Student ID    subject  score letter
0       ABC123       123456  reading_a     98      A
1       ABC123       123456    math_a     96      A
2       ABC123       987654  reading_a     77      C
3       ABC123       987654    math_a     88      B
4       DEF456       102938  reading_a     88      B
5       DEF456       102938    math_a     99      A

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:25:23