【Pandas】使用 pandas 处理多层级 Excel 表头的实用指南

在这里插入图片描述

背景

在数据分析和业务报告中,Excel 文件广泛用于存储和展示信息,特别是在需要对数据进行分类和分组时。许多商业场景中,数据会以多层级表头的形式呈现,体现不同维度的信息。例如,在财务报表中,可能按年度、季度和产品类别等层次展示;在人力资源管理中,考勤数据可能按照部门、职位等进行分类。

然而,处理多层级的 Excel 表头增加了数据操作的复杂性。手动操作这些数据容易出错,且不利于后续的自动化处理。此时,pandas 库提供了强大而灵活的 MultiIndex.loc[] 方法来简化这些操作,使得高效地读取和处理这些层级化数据成为可能。本文将介绍如何使用 MultiIndex.loc[] 处理多层级 Excel 表头,帮助我们在实际业务中提升效率。

前置操作

在处理Excel 文件时,首先需要安装 pandas 库。如果尚未安装,可以通过以下命令安装:

pip install pandas openpyxl

为本文准备一份演示的名为 demo.xlsx 的文件,内容如下截图所示:

在这里插入图片描述

1. 理解 MultiIndex 的概念

MultiIndexpandas 中一种特殊的索引类型,允许在行或列上使用多个级别的索引。这种结构使得数据可以更清晰地组织成层次关系。例如,一个考勤表可能包含多列(如“基础信息”、“考勤管理”)作为顶层索引,而具体的类别作为次级索引。

应用场景

在处理带有层级结构的 Excel 文件时,MultiIndex 特别有用。例如,财务报表可能按月份、产品类别等层级组织,使用 MultiIndex 可以方便地进行数据分析和报告生成。

2. 读取多层级表头的 Excel 文件

接下来,我们使用 pandasread_excel() 函数读取 Excel 文件,并指定前几行为表头:

import pandas as pd# 读取 Excel 文件,指定前两行为表头
df = pd.read_excel('demo.xlsx', header=[0, 1])# 查看生成的多层级表头
print(df.columns)

在此示例中,header=[0, 1] 表示将 Excel 文件中的第 1 行和第 2 行作为表头。这两行的内容将形成一个 MultiIndex 结构,使得后续的数据处理更加灵活。([0, 1]是行索引~)

3. 将多层表头的数据处理为嵌套字典

为了便于后续的数据提取和分析,我们可以将多层级的表头转换为嵌套字典。这种结构化的方法可以帮助我们更清晰地查看和访问各个层级的列信息。

以下代码展示了如何实现:

from collections import defaultdict# 将多层表头的数据处理为嵌套字典
result = defaultdict(lambda: {'column': [], 'index': []})# 遍历每个大类列
for idx, columns in enumerate(df.columns.values.tolist()):key, val = columnsresult[key]['column'].append(val)result[key]['index'].append(idx)# 打印最终结果字典
print(dict(result))

该代码的输出:

{"员工": {"column": ["Unnamed: 0_level_1"], "index": [0]}, "基础信息": {"column": ["部门", "职务", "工号"], "index": [1, 2, 3]}, "考勤管理": {"column": ["迟到", "早退", "请假", "外出", "加班"], "index": [4, 5, 6, 7, 8]}
}

在这段代码中,我们使用 defaultdict 创建了一个嵌套字典。通过遍历 df.columns.values.tolist(),我们提取了每个大类的列名和索引,将它们存储在字典中。这样一来,我们就能够方便地获取某一大类下所有的列信息,为后续的数据处理打下基础。

4. 多层级表头的切片与筛选

在处理多层级数据时,灵活的切片与筛选是分析的关键步骤。通过使用 MultiIndex 结构,我们可以高效地访问特定的数据子集,确保分析的精确性和高效性。

切片与筛选的基本概念

切片和筛选是指通过特定条件选择数据的过程。在 pandas 中,切片可以使用 .loc[] 方法和 IndexSlice 类进行,允许我们根据多层级索引来提取所需数据。

使用 .loc[] 进行切片

.loc[] 的基本用法是:

data = df.loc[row_indexer, column_indexer]
  • row_indexer 用于指定行的选择。
  • column_indexer 用于指定列的选择。

在多层级索引中,可以使用 pd.IndexSlice 来简化选择过程。例如,若我们需要提取某个特定类别下的所有列数据,可以使用如下代码:

# 提取特定的列,提取顶层A列的one二级列
data = df.loc[:, pd.IndexSlice['A', 'one']]	
print(data)

这里的 pd.IndexSlice 允许我们根据多层级的索引值精确提取需要的数据,: 表示我们选择所有行。

例子分析

使用本文提供的 Excel 文件示例,

多层级获取顶级列全部的子列
# 提取“基础信息”的所有员工基本信息
base_info = df.loc[:, pd.IndexSlice['基础信息', slice(None)]]
print(base_info)

在这个例子中,slice(None) 表示选择“基础信息”顶层列下的所有类别列。

输出结果如下:

  基础信息        部门   职务 工号
0  行政部   经理  1
1  行政部   助教  2
2  行政部   助理  3
3  研发部  程序员  4
4  研发部  程序员  5
多层级获取顶级列的指定子列

如获取 考勤管理 中的 请假 和 加班列的内容

# 提取“基础信息”的所有员工基本信息
base_info = df.loc[:, pd.IndexSlice['考勤管理', ['请假', '加班']]]
print(base_info)

在这个例子中,pd.IndexSlice['考勤管理', ['请假', '加班']] 表示选择“考勤管理”顶层列下的“请假”和”加班“。

输出结果如下:

  考勤管理   请假 加班
0    0  0
1    0  5
2    0  0
3    0  0
4    2  7
结合多个条件进行筛选

我们还可以结合多个条件进行筛选,例如,选择“职务”为程序员中 早退 次数大于 0 的员工:

# 筛选“销售”部门中迟到次数大于 0 的员工
leave_early_data = df.loc[(df[('基础信息', '职务')] == '程序员') &(df[('考勤管理', '早退')] >= 0)
]
print(leave_early_data)

输出结果如下:

                  员工 基础信息         考勤管理            Unnamed: 0_level_1   部门   职务 工号   迟到 早退 请假 外出 加班
3                 赵六  研发部  程序员  4    4  2  0  0  0
4                 钱七  研发部  程序员  5    0  3  2  4  7

筛选的灵活性

通过使用切片和筛选方法,用户可以灵活地从多层级数据中提取所需的信息。例如,在进行员工考勤分析时,我们可以快速获取特定考勤类别、时间段或特定客户群体的具体数据。这种灵活性使得数据分析过程更为高效,并能快速响应业务需求。

小结

本节介绍了如何使用 MultiIndex.loc[] 对多层级表头的数据进行切片和筛选。我们可以根据业务需求选择特定的列,结合不同条件进行筛选,方便分析不同维度的数据。这些工具为我们提供了灵活且高效的数据提取方法,特别适合在数据集复杂的业务场景中使用。

5. 多层级表头的重构与扁平化

在处理带有多层级表头的Excel数据时,有时需要将表头扁平化,以便于后续的操作和分析。通过将多层级表头拼接成一个单层表头,可以有效地简化数据结构。

扁平化表头代码示例

import pandas as pd# 读取Excel文件并指定表头为多层级
df = pd.read_excel('demo.xlsx', header=[0, 1])# 使用扁平化方式将多层级表头合并
df.columns = ['_'.join(col).strip() for col in df.columns.values]# 显示处理后的DataFrame
print(df)

上述代码会将表头中的多层级转化为以下形式的单层表头:

  员工 基础信息_部门 基础信息_职务  ...  考勤管理_请假  考勤管理_外出  考勤管理_加班
0                    张三     行政部      经理  ...        0        0        0
1                    李四     行政部      助教  ...        0        1        5
2                    王五     行政部      助理  ...        0        0        0
3                    赵六     研发部     程序员  ...        0        0        0
4                    钱七     研发部     程序员  ...        2        4        7

扁平化表头的应用场景

表头扁平化的操作特别适用于需要对数据进行进一步的分析、可视化或者保存为简单格式(如CSV)的场景。通过将复杂的多层级表头转化为便于操作的单层级表头,我们可以更轻松地进行列选择、筛选、分组等常见的数据处理操作。

总结

本文详细介绍了如何使用 MultiIndex.loc[] 方法处理多层级 Excel 表头。我们学习了如何读取带有多层级表头的 Excel 文件,精确提取和筛选数据,以及如何将多层级表头扁平化以便于后续处理。

通过掌握这些技术,你将能够在数据分析过程中高效地处理复杂的 Excel 文件,提升工作效率。

后话

本次分享到此结束,
see you~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【YApi】接口管理平台

一、简介 YApi 是一个用于前后端开发团队协作的 API 管理平台,帮助团队更加高效地进行 API 接口的设计、测试、文档管理和版本控制等工作。 YApi 主要功能: API 设计和管理:提供 API 设计和文档生成工具,使开发者能够轻松创建、…

ctfshow(159->162)--文件上传漏洞

Web159 考点: 前端校验MIME验证黑名单 思路: 上传.user.ini文件: 文件内容auto_prepend_fileshell.png 由于网页存在前端过滤,只允许上传.png文件,所以我们将文件名修改为.user.ini.png上传,然后抓包删除.png后缀名…

使用pytest单元测试框架执行单元测试

Pytest 是一个功能强大且灵活的 Python 单元测试框架,它使编写、组织和运行测试变得更加简单。以下是 Pytest 的一些主要特点和优点: 简单易用:Pytest 提供了简洁而直观的语法,使编写测试用例变得非常容易。它支持使用 assert 语…

可视化平台FineBI的安装及简单使用

本章知识简介 主线B: 安装FineBI 主线C: FineBI的使用. 本章目标: 1:了解FineBI的安装; [了解]"傻瓜式"安装 2:知道FineBI的使用流程; [了解]a.连接数据b.创建组件与分析数据c.可视化组件d.添加交互效果e.制作仪表板 3:知道如何连接数据; [重点]添加业…

推荐一款优秀的pdf编辑器:Ashampoo PDF Pro

Ashampoo PDF Pro是管理和编辑 PDF 文档的完整解决方案。程序拥有您创建、转换、编辑和保护文档所需的一切功能。根据需要可以创建特定大小的文档,跨设备可读,还可以保护文件。现在您还能像编辑Word文档一样编辑PDF! 软件特点 轻松处理文字 如 Microso…

云原生后端开发教程

云原生后端开发教程 引言 随着云计算的普及,云原生架构逐渐成为现代软件开发的主流。云原生不仅仅是将应用部署到云上,而是一种构建和运行应用的方式,充分利用云计算的弹性和灵活性。本文将深入探讨云原生后端开发的核心概念、工具和实践&a…

XQT_UI 组件|02| 按钮 XPushButton

XPushButton 使用文档 简介 XPushButton 是一个自定义的按钮类,基于 Qt 框架构建,提供了丰富的样式和功能选项。它允许开发者轻松创建具有不同外观和行为的按钮,以满足用户界面的需求。 特性 颜色设置:支持多种颜色选择。样式设…

Linux线程安全(二)条件变量实现线程同步

目录 条件变量 条件变量初始化和唤醒 键盘触发条件变量唤醒线程demo 条件变量的等待 条件变量定时等待demo 条线变量实现多线程间的同步 条件变量 条件变量是为了控制多个线程的同步工作而设计的 比如说一个系统中有多个线程的存在但有且仅有一个线程在工作&#xff0c…

python的lambda实用技巧

lambda表达式 lambda表达式是一种简化的函数表现形式,也叫匿名函数,可以存在函数名也可以不存在。 使用一行代码就可以表示一个函数: # 格式 lambda arg[参数] : exp[表现形式] # 无参写法 lambda : "hello" # 一般写法 lambda …

复现第一周24

1.[SWPUCTF 2021 新生赛]gift_F12 1)打开题目 2)看源码 3)直接ctrl+f搜索flag 2.[SWPUCTF 2021 新生赛]nc签到 1)开题 2)下载附件用记事本打开 3)打开kali使用nc连接代码 输入l\s命令绕过黑名…

开发流程初学者指南——需求分析

目录 从零开始理解需求分析什么是需求分析?需求分析的目标需求分析的基本原则需求分析的各个阶段需求分析的常用方法和工具编写需求文档总结 从零开始理解需求分析 需求分析是软件开发过程中不可或缺的一环,它帮助我们明确用户的需求,确保最…

大模型,多模态大模型面试【LoRA,分类,动静态数据类型,DDPM,ControlNet,IP-Adapter, Stable Diffusion】

大模型,多模态大模型面试【LoRA,分类,动静态数据类型,DDPM,ControlNet,IP-Adapter, Stable Diffusion】 问题一:LoRA是用在节省资源的场景下,那么LoRA具体是节省了内存带宽还是显存呢…

数据结构之链式结构二叉树的实现(进阶版)

本篇文章主要讲解链式二叉树的层序遍历以及判断是否为一棵完全二叉树 二者将会用到之前学过的队列知识,是将队列和二叉树的整合 一、如何将之前已经写好的文件加入当前的编译界面 如图所示,打开我们需要加入文件所在的文件夹,找到我们要加…

StructRAG简介

StructRAG是一种新型的框架,旨在提升大型语言模型(LLMs)在知识密集型推理任务中的性能。它通过推理时的混合信息结构化机制,根据任务需求以最合适的格式构建和利用结构化知识。 以下是StructRAG的核心组成部分和工作流程&#xff…

Windows Server NTFS磁盘变RAM的处理过程

问题描述 客户服务器的磁盘数据爆满,需要将磁盘进行扩容,因为是虚拟机所以先在虚拟化平台上将原来的磁盘空间改大,再进入系统,在磁盘管理器上将需要扩容的磁盘进行扩展。扩展完后系统报文件系统有问题,扩容的磁盘容量…

如何让反向代购客户享受丝滑般的下单之旅?

想象一下,一键下单,轻松购物,仿佛穿越时空的魔法,让中国好货瞬间触手可及!从made in china的美妆神器到潮流服饰,从尖端数码产品到温馨家居用品,从令人垂涎的美食到贴心的母婴用品,这…

解决Selenium的3大痛点!这款工具让你的自动化测试效率翻倍!

相信使用过Selenium WebDriver的小伙伴对其最大的诟病有3点,一是浏览器的driver和版本对应问题,第二是Selenium的执行速度,最后一个槽点是对页面元素文本值的断言非常不便。 在我们长期维护大量UI自动化测试用例的过程中这些痛点会让我们耗费…

5G基础知识

什么是 FDD 频分双工(Frequency Division Duplexing),理解起来很简单,就是把上行和下行业务隔离在两个频段,互不干扰。 而 TDD 时分双工(Time-Division Duplexing),是指上行下业务完…

使用 Elastic Observability 监控 dbt 管道

作者:来自 Elastic Almudena Sanz Oliv•Tamara Dancheva 了解如何使用 Elastic 设置 dbt 监控系统,该系统可主动发出数据处理成本峰值、每张表的行数异常以及数据质量测试失败的警报。 在 Elastic 可观察性组织内的数据分析团队中,我们使用 …