0

0

如何正确使用 Pandas 的 droplevel() 删除多级列索引

花韻仙語

花韻仙語

发布时间:2026-01-22 10:25:02

|

159人浏览过

|

来源于php中文网

原创

如何正确使用 Pandas 的 droplevel() 删除多级列索引

本文详解 `droplevel()` 在处理 `pd.read_html()` 解析出的多级表头时的正确用法,解决因误操作 `players[0]` 导致的 `attributeerror` 和 `keyerror`,并提供列索引降级、数据合并等完整实践步骤。

当你使用 pd.read_html() 从网页中解析表格时,Pandas 常会将具有嵌套结构(如带“主标题+子标题”的统计表)的 HTML 表格自动解析为 多级列索引(MultiIndex)。例如,一个“Standard Stats”表格可能生成形如 (‘Player’, ‘’), (‘Shooting’, ‘Dist’) 的双层列名。此时直接调用 .droplevel() 是合理的,但必须确保操作对象是 DataFrame.columns(即 Index 或 MultiIndex 类型),而非普通 Python 列表或错误索引的 DataFrame。

✅ 正确操作流程

首先明确:pd.read_html(...) 始终返回 list 类型,即使只匹配到一个表格,也需显式取 [0] 获取 DataFrame:

# ❌ 错误:players 是 list,list 没有 .columns 属性
players = pd.read_html(data.text, match="Standard Stats")
players.columns = players.columns.droplevel()  # AttributeError!

# ✅ 正确:先提取 DataFrame,再操作其 columns
players = pd.read_html(data.text, match="Standard Stats")[0]
players.columns = players.columns.droplevel(0)  # 显式指定 level=0(顶层)
? 注意:.droplevel() 默认降第一级(level=0),但建议显式传参增强可读性。若列索引有三层,可写 .droplevel([0, 1]) 或 .droplevel(0).droplevel(0)。

⚠️ 常见错误解析

  • AttributeError: 'list' object has no attribute 'columns'
    根源:对 players(列表)直接调用 .columns。修复:务必先执行 players = players[0]。

  • KeyError: 0(在 players[0] 时报错)
    根源:players 已是 DataFrame,此时 players[0] 被解释为按列名 0 查找——但列名通常为字符串(如 'Player'),导致 KeyError。删除该行即可

    # ❌ 错误残留(在已赋值为 DataFrame 后还写 players[0])
    players = pd.read_html(StringIO(data.text), match="Standard Stats")[0]
    players[0]  # → KeyError: 0
    
    # ✅ 正确:只需打印或后续处理
    print(players.head())  # 查看结果

? 合并多表时的列名对齐技巧

你提到需将 players 与 shooting 表按 "Player" 字段合并,却报 KeyError: 'Player'。这通常意味着:

  1. 目标列名不存在:检查实际列名是否含空格、大小写差异或隐藏层级

    print(players.columns.tolist())  # 查看真实列名,如可能是 ('Player', '') 或 'Player Name'
    print(shooting.columns.tolist())
  2. 多级列索引未清理:若 shooting 同样来自 read_html(),也需先降级:

    Powtoon
    Powtoon

    AI创建令人惊叹的动画短片及简报

    下载
    shooting = pd.read_html(data.text, match="Shooting Stats")[0]
    shooting.columns = shooting.columns.droplevel(0)  # 先清理列索引
  3. 安全合并(推荐):显式指定左右键,避免依赖列名直连:

    # 确保 players 和 shooting 都有 'Player' 列(且类型一致)
    team_data = players.merge(
        shooting[['Player', 'Dist']],    # 显式选取所需列
        on='Player',                      # 指定连接键
        how='left'                        # 推荐 left,保留 players 全量数据
    )

✅ 最终稳健代码模板

import pandas as pd
from io import StringIO

# 1. 解析并提取单个 DataFrame
players = pd.read_html(data.text, match="Standard Stats")[0]
shooting = pd.read_html(data.text, match="Shooting Stats")[0]

# 2. 清理多级列索引(关键!)
players.columns = players.columns.droplevel(0)
shooting.columns = shooting.columns.droplevel(0)

# 3. 可选:标准化列名(去除空格/统一大小写)
players.columns = players.columns.str.strip().str.title()
shooting.columns = shooting.columns.str.strip().str.title()

# 4. 合并(确保 'Player' 列存在且无缺失)
print("Players columns:", players.columns.tolist())
print("Shooting columns:", shooting.columns.tolist())

team_data = players.merge(
    shooting[['Player', 'Dist']],
    on='Player',
    how='left'
)

? 提示:使用 df.info() 和 df.columns.tolist() 是调试列索引问题最高效的手段。永远先验证数据结构,再执行 .droplevel() 或 .merge() —— 这能避免 90% 的 KeyError。

通过以上步骤,你不仅能正确移除冗余表头层级,还能构建健壮的数据整合流水线,为后续分析打下坚实基础。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

772

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

661

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

679

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1365

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

730

2023.08.11

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 13.7万人学习

Django 教程
Django 教程

共28课时 | 3.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号