Python pandas列转行时出现TypeError报错的原因及解决方法
错误原因
你在构建DataFrame时传入的columns参数是嵌套列表结构,导致最终得到的DataFrame列索引为多层索引(MultiIndex),而非你预期的单层文本索引。你调用melt、set_index时传入的列名是普通字符串,无法匹配多层索引结构,因此抛出类型错误。
你可以执行print(df.columns)验证这一点,输出会显示类似以下的多层索引结构:
MultiIndex([('Tahun',), ('Jan',), ('Feb',), ... ('Nov',)], )
解决方法
方案1:从数据生成环节修复(推荐)
你爬取表头的代码中,column_变量是列表嵌套列表的结构,原因是table.find_all('thead')返回的结果只有一个thead元素,你循环时把每一组表头都作为子列表append到了column_中,只需要在构建DataFrame时取column_的第一个元素即可:
# 把原来的df构建代码替换成下面这行 df = pd.DataFrame(output, columns=column_[0])
修复后你原来写的melt、stack转换代码都可以正常运行,直接得到你需要的长表结构。
方案2:对已生成的DataFrame修复列索引
如果你不想修改爬取代码,也可以直接把已有的多层列索引压平为单层:
# 压平列索引 df.columns = df.columns.get_level_values(0) # 执行melt转换 result = df.melt(id_vars=["Tahun"], var_name="Month", value_name="Value") # 按年份、月份排序可选 result = result.sort_values(["Tahun", "Month"], ignore_index=True)
内容的提问来源于stack exchange,提问作者ohai
相关产品推荐
相关产品推荐

