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

如何移除DataFrame多层表头并清理Year列特殊标记?

问题1:移除多层顶部表头

维基百科的表格通常会生成多层索引(MultiIndex)的表头,可根据需求选择以下两种专业处理方式:

方式1:直接移除顶层表头

如果顶层表头是重复或无意义的分类,通过droplevel直接移除:

import pandas as pd

# 读取目标表格
url = "https://zh.wikipedia.org/wiki/%E5%90%84%E5%9B%BD%E5%90%8D%E4%B9%89GDP%E5%88%97%E8%A1%A8"
df = pd.read_html(url)[0]

# 判断是否为多层表头
if isinstance(df.columns, pd.MultiIndex):
    # 移除顶层索引(层级从0开始计数)
    df.columns = df.columns.droplevel(0)

# 重置索引(可选,清理行索引)
df = df.reset_index(drop=True)

方式2:合并多层表头为单个名称

如果上下层表头均有实际意义,可拼接成复合表头:

df.columns = [' '.join(filter(None, col)).strip() for col in df.columns.values]

问题2:处理Year列的标记及AttributeError

错误原因

触发AttributeError的核心原因:

  1. Year列存在非字符串类型值(如NaN、float类型空值),直接调用字符串方法会报错;
  2. 自定义函数未做类型兼容处理,比如直接对非字符串值执行split()等操作。

解决方案

优先使用pandas字符串向量方法(比apply更高效),若需保留apply写法则需做类型兼容:

方案1:字符串向量方法处理(推荐)

# 先将Year列转为字符串,兼容非字符串值
df['Year'] = df['Year'].astype(str)

# 提取数字部分(正则匹配连续数字)
df['Year'] = df['Year'].str.extract(r'(\d+)', expand=False)

# 或移除所有非数字字符
# df['Year'] = df['Year'].str.replace(r'\D+', '', regex=True)

# 可选:转回数值类型
df['Year'] = pd.to_numeric(df['Year'], errors='coerce')

方案2:修复自定义函数+apply写法

def clean_year(row):
    # 强制转为字符串,兼容非字符串值
    year_val = str(row['Year'])
    # 提取数字字符
    return ''.join([c for c in year_val if c.isdigit()])

# 应用函数
df['Year'] = df.apply(clean_year, axis=1)

# 可选:转为数值类型
df['Year'] = pd.to_numeric(df['Year'], errors='coerce')

内容的提问来源于stack exchange,提问作者neural science

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:42:49