如何移除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的核心原因:
- Year列存在非字符串类型值(如
NaN、float类型空值),直接调用字符串方法会报错; - 自定义函数未做类型兼容处理,比如直接对非字符串值执行
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
相关产品推荐
相关产品推荐

