使用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
相关产品推荐
相关产品推荐

