Pandas设置Season列为索引后值全为NaN问题求助
问题排查与解决:Survivor选手数据Season索引全为NaN的问题
问题背景
爬取《Survivor》第11到46季的选手数据,将各季表格存入字典后合并为单个DataFrame,为每个选手添加Season列标注所属赛季,但调用set_index('Season')后,索引值全部显示为NaN。
问题原因
通过pd.read_html从维基百科爬取的表格列是多级索引(MultiIndex)(如运行结果中的(Contestant, Contestant)),手动添加Season列时,pandas会自动将该列名适配为匹配的多级格式(即('Season',))。而你调用set_index('Season')时使用的是普通字符串列名,pandas无法找到对应列,因此生成的索引全为NaN。
修复方案
方案1:扁平化多级列名(推荐,更直观)
先将原表格的多级列名转换为普通字符串,再添加Season列:
import pandas as pd contestants = {} for season in range(11, 47): wiki_url = f'https://en.wikipedia.org/wiki/Survivor_{season}' tables = pd.read_html(wiki_url) df = tables[1] # 扁平化多级列名:合并两级名称,用下划线连接 df.columns = ['_'.join(col).strip() for col in df.columns.values] # 添加Season列 df['Season'] = season contestants[season] = df # 合并并设置索引 contestants_joined = pd.concat(contestants.values()).set_index('Season', drop=False) print(contestants_joined.head())
方案2:使用正确的多级列名设置索引
如果保留原多级列名,需用元组形式指定Season列的多级列名:
import pandas as pd contestants = {} for season in range(11, 47): wiki_url = f'https://en.wikipedia.org/wiki/Survivor_{season}' tables = pd.read_html(wiki_url) df = tables[1] # 以多级列名格式添加Season列 df[('Season',)] = season contestants[season] = df # 用多级列名设置索引,并给索引重命名 contestants_joined = pd.concat(contestants.values()).set_index(('Season',), drop=False) contestants_joined.index.name = 'Season' print(contestants_joined.head())
验证结果
两种方案修复后,Season索引会正确显示对应赛季的数字,不再出现NaN值。
参考文档建议
- 学习pandas**MultiIndex(多级索引)**的相关内容,掌握多级列的创建、修改与查询
- 查阅
pd.read_html的官方文档,明确返回DataFrame的列结构特性 - 深入理解
set_index的参数规则,知晓其支持字符串、元组等多种索引指定方式
内容的提问来源于stack exchange,提问作者Brandon Jessup
相关产品推荐
相关产品推荐

