You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:37:10