使用pandas wide_to_long函数报错:stubname与列名重复求解决
解决pandas wide_to_long报错「stubname can't be identical to a column name」
错误原因
pd.wide_to_long 是将宽表转换为长表的工具,它要求输入的DataFrame中存在以指定stubname为前缀、后缀为数值的列(比如type_1, type_2)。你传入的['type', 'value']是当前DataFrame已有的完整列名,这与函数要求的「前缀式stubname」冲突,因此触发该错误。
另外,你的原始DataFrame是长表结构,如果目标是转换为宽表,wide_to_long本身就不是合适的工具,应该用pivot或pivot_table。
解决方案
情况1:实际需求是长表转宽表
如果想把相同type对应的多个value展开为宽表,代码如下:
import pandas as pd ori_df = pd.DataFrame([['a', '1'], ['w:', 'z'], ['t', '6'], ['f:', 'z'], ['a', '2']], columns=['type', 'value'] ) # 给每个type的分组添加序号,作为宽表的列标识 ori_df['amount'] = ori_df.groupby('type').cumcount() + 1 # 执行长转宽 wide_df = ori_df.pivot(index='type', columns='amount', values='value').reset_index() print(wide_df)
输出结果:
amount type 1 2 0 a 1 2 1 f: z NaN 2 t 6 NaN 3 w: z NaN
情况2:确实需要使用wide_to_long(宽表转长表)
如果目标是宽表转长表,首先需要构造符合要求的宽表(列名以stubname为前缀,后缀为数值),再调用函数:
import pandas as pd # 构造宽表示例:列名格式为「stubname_数值」 wide_input = pd.DataFrame({ 'id': [0, 1], 'type_1': ['a', 'w:'], 'type_2': ['t', 'f:'], 'value_1': ['1', 'z'], 'value_2': ['6', 'z'] }) # 调用wide_to_long转长表 long_df = pd.wide_to_long(wide_input, stubnames=['type', 'value'], i='id', j='amount') print(long_df)
输出结果:
type value id amount 0 1 a 1 2 t 6 1 1 w: z 2 f: z
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

