为何read_html生成的DataFrame无法用.melt处理?报ValueError错误
问题原因与解决办法
核心报错原因
你遇到的ValueError本质是列名被设置成了多层索引(MultiIndex),而pd.melt无法处理非一维的列结构。问题出在这行代码:
cities.columns = [labels]
labels本身是一个一维列表,你额外套了一层[],导致DataFrame的列名变成了单层的MultiIndex(每个列的“名称”绑定了整个labels列表),而非普通的一维列名数组。这种情况下,后续调用melt时,pandas无法识别正确的列维度,就会抛出“每个列数组必须是一维”的错误。
另外还有一个细节问题:你设置的列名是小写的'city',但后续melt里写的是id_vars=['City'],大小写不匹配,即使前面的问题解决了,这里也会报错找不到对应列。
修正后的代码
import pandas as pd cities = pd.read_html("assets/wikipedia_data.html", skiprows=1) cities = cities[0].dropna(axis=0, thresh=4) labels=['city',2,3,4,5,6,7,8,9,10,11,12] # 去掉外层[],直接用labels设置一维列名 cities.columns = labels cols=[1,2,3,4,9] cities.drop(cities.columns[cols], axis=1, inplace=True) # 用小写的'city'匹配列名 cities = cities.melt(id_vars=['city'])
补充说明
pd.read_html返回的DataFrame本身没有特殊特性,和普通DataFrame行为完全一致。你的测试数据集能正常运行,是因为测试时的列名设置是正确的一维结构,没有误创建MultiIndex。
内容的提问来源于stack exchange,提问作者ian4339
相关产品推荐
相关产品推荐

