使用Pandas wide_to_long实现下划线列名的宽表转长表求助
搞定Pandas宽表转长表的KeyError问题
嘿,我来帮你解决这个问题!你现在要把列名是u_i格式的宽表转成包含cat、u、i、mouse的长表,原代码报错KeyError,核心原因是pd.wide_to_long的参数用错了,而且没处理好原表的行索引(也就是目标表的cat列)。
我给你两种靠谱的实现方案,都能适配任意同格式的数据,先讲最通用的一种:
方案一:用melt+字符串拆分(推荐,适配所有同格式列名)
这种方法不需要提前知道u的取值范围,不管你的列是1_1还是100_200都能处理:
先把行索引转成
cat列
原表的行索引就是目标表的cat值,所以先把索引转成列:df = df.reset_index().rename(columns={'index': 'cat'})将宽表转成初步长表
用melt把所有u_i格式的列转成键值对:df_long = df.melt(id_vars='cat', var_name='u_i', value_name='mouse')这一步之后,表会有
cat、u_i(原列名)、mouse(单元格值)三列。拆分
u_i列得到u和i
按下划线拆分列名,转换成整数类型:df_long[['u', 'i']] = df_long['u_i'].str.split('_', expand=True).astype(int)整理最终表结构
删除多余的u_i列,调整列顺序到你需要的样子:df_final = df_long.drop(columns='u_i')[['cat', 'u', 'i', 'mouse']]
方案二:改进pd.wide_to_long的用法
如果你想用wide_to_long,得调整参数,处理好分隔符和索引列:
同样先把行索引转成
cat列df = df.reset_index().rename(columns={'index': 'cat'})调用
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()拆分
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
相关产品推荐
相关产品推荐

