用 Pandas 处理结构不佳的 Excel 文件

news2025/1/18 13:51:50

简介

用pandas很容易读取Excel文件并将数据转换为DataFrame。然而现实世界中的Excel文件往往构造不佳,在那些数据散落在工作表中的情况下,你可能需要定制读取数据的方式。本文将讨论如何使用pandas和openpyxl来读取这些类型的Excel文件,并干净地将数据转换为适合进一步分析的DataFrame。

问题

pandas 的 read_excel函数在读取Excel工作表方面做得很好。然而,在数据不是从A1单元格开始的连续表格的情况下,结果可能不是你所期望的那样。

比如当你尝试使用 read_excel(src_file)读取下面这个电子表格样本。

你会得到一些下面这样的东西。

这些结果包括很多 Unnamed的列、行内的标题标签以及一些我们不需要的额外列。

Pandas解决方案

对于这个数据集,最简单的解决方案是使用 read_excel()headerusecols参数。尤其是 usecols参数,对于控制你想包括的列非常有用。

如果你想继续学习这些例子,文件在github上。

 
  1. https://github.com/chris1610/pbpython/blob/master/data/shipping_tables.xlsx

下面是一个替代方法,只读取我们需要的数据。

 
  1. import pandas as pd

  2. from pathlib importPath

  3. src_file = Path.cwd() / 'shipping_tables.xlsx'

  4. df = pd.read_excel(src_file, header=1, usecols='B:F')

产生的DataFrame只包含我们需要的数据。在这个例子中,我们特意排除了备注栏和日期栏。

usecols可以接受Excel范围,如 B:F,并只读入这些列。header参数期望一个定义标题列的单一整数。这个值是以0为索引的,所以我们传入 1,尽管这是Excel的第2行。

在某些情况下,我们可能希望将列定义为一个数字列表。在这个例子中,我们可以定义为整数的列表。

 
  1. df = pd.read_excel(src_file, header=1, usecols=[1,2,3,4,5])

如果你对一个大的数据集有某种想要遵循的数字模式(即每3列或只有偶数列),这种方法可能会很有用。

pandas的 usecols也可以接受一个列名的列表。这段代码将创建一个等效的DataFrame。

 
  1. # Define a more complex function:

  2. def column_check(x):

  3. if'unnamed'in x.lower():

  4. returnFalse

  5. if'priority'in x.lower():

  6. returnFalse

  7. if'order'in x.lower():

  8. returnTrue

  9. returnTrue

  10. df = pd.read_excel(src_file, header=1, usecols=column_check)

需要记住的关键概念是,该函数将按名称解析每一列,必须为每一列返回 TrueFalse。那些被评估为 True的列将被包括在内。

另一种使用可调用函数的方法是包含一个 lambda表达式。这里有一个例子,我们想只包括一个定义好的列的列表。我们通过将名称转换为小写字母来进行规范化,以便于比较。

 
  1. cols_to_use = ['item_type', 'order id', 'order date', 'state', 'priority']

  2. df = pd.read_excel(src_file,

  3. header=1,

  4. usecols=lambda x: x.lower() in cols_to_use)

可调用函数给了我们很大的灵活性来处理现实世界中混乱的Excel文件。

区间和表格

在某些情况下,数据在Excel中可以更加模糊不清。在这个例子中,我们有一个叫做 ship_cost的表,我们想读取它。如果你必须处理这样的文件,用我们到目前为止讨论过的pandas选项来读入可能是个挑战。

在这种情况下,我们可以直接使用openpyxl来解析文件并将数据转换成pandas DataFrame。事实上,数据是在一个Excel表格中,可以使这个过程更容易一些。

下面是如何使用openpyxl来读取Excel文件。

 
  1. from openpyxl import load_workbook

  2. import pandas as pd

  3. from pathlib importPath

  4. src_file = src_file = Path.cwd() / 'shipping_tables.xlsx'

  5. wb = load_workbook(filename = src_file)

这将加载整个工作簿。如果我们想看到所有的工作表。

 
  1. wb.sheetnames

 
  1. ['sales', 'shipping_rates']

要访问具体的工作表。

 
  1. sheet = wb['shipping_rates']

要查看所有命名的表的列表。

 
  1. sheet.tables.keys()

 
  1. dict_keys(['ship_cost'])

这个键对应于我们在Excel中分配给表的名称。现在我们访问该表,以获得相当于Excel的范围。

 
  1. lookup_table = sheet.tables['ship_cost']

  2. lookup_table.ref

 
  1. 'C8:E16'

这就成功了。我们现在知道了我们要加载的数据范围。最后一步是将这个范围转换为pandas DataFrame。下面是一个简短的代码片段,用来循环浏览每一行并转换为一个DataFrame。

 
  1. # Access the data in the table range

  2. data = sheet[lookup_table.ref]

  3. rows_list = []

  4. # Loop through each row and get the values in the cells

  5. for row in data:

  6. # Get a list of all columns in each row

  7. cols = []

  8. for col in row:

  9. cols.append(col.value)

  10. rows_list.append(cols)

  11. # Create a pandas dataframe from the rows_list.

  12. # The first row is the column names

  13. df = pd.DataFrame(data=rows_list[1:], index=None, columns=rows_list[0])

下面是产生的数据框架。

现在我们有了干净的表格,可以用于进一步的计算。

总结

在一个理想的条件下,我们使用的数据应该拥有一个简单一致的格式。在本文的例子中,我们可以很容易地删除行和列,使之更符合格式要求。然而,有些时候,这样做是不可行的,也是不可取的。好消息是,pandas和openpyxl为我们提供了读取Excel数据所需的所有工具。

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

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

相关文章

手机视频怎么裁剪时长?教你三招快速搞定

大家知道手机视频怎么裁剪时长吗?现如今,新媒体行业发达,因为很多地方都需要用到视频文件,所以对视频处理的相关操作是免不了的。那么当你因为视频时长过长,导致视频无法发布的时候,你是怎么做的呢&#xf…

第六章JDBC基础详解

文章目录什么是JDBC数据库编程的必要条件JDBC工作原理JDBC如何建立数据库连接JBDC的基本操作添加操作修改操作删除操作查询操作JDBC使用的步骤JDBC的批处理操作JDBC数据源连接池关于执行sql语句的对象什么是JDBC 数据库编程的必要条件 编程语言,如Java&#xff0c…

靶向药物丨艾美捷西妥昔单抗Cetuximab方案

西妥昔单抗Cetuximab基本信息: 中文名 西妥昔单抗 英文名 Cetuximab 别名 西妥昔单抗 EGFR抑制剂 西妥昔单抗对照品 6-二氨基庚二酸 英文别名 IMC 225 Hsdb 7454 CETUXIMAB EGFR antibody CetuxiMab(C225) Cetuximab - Buffer solution CAS 205923-56-…

【图像增强】暗通道图像去雾【含GUI Matlab源码 740期】

⛄一、简介 1 暗通道先验图像去雾方法 1.1 光线透射率模型 光在传播中由于散射使得从光源发出的辐射只有部分能到达接收传感器,其他则被散射到传播介质中。假设距离较小时散射光强与距离是线性关系,当光源距离传感器无限接近时,光的衰减值可…

定期执行命令、脚本之Linux

在linux下,如果想要在未来的某个时刻执行某个任务,并且在未来的每一个这样的时刻里都要执行这个任务,举个简单的例子,比如说想要在将来,每天的十二点都重启路由器,大多数发行版都自带一个守护进程&#xff…

【敏捷转型,效能提升】万字长文敏捷转型实践系列分享

作者:王先科、田野、王锁、刘双、马越、刘思琪 摘要:本文总结了近4年以来部门实施敏捷转型的实践及经验教训,从5个方面进行了阐述: 1. 文化建设下好先手棋 2. 持续敏捷实践祭出连环招 3. 沉淀实践指引把牢定盘星 4. 效能度量…

英飞凌-AURIX-TC3XX-内核架构:AURIX TriCore 1.6P

目录英飞凌-AURIX-TC3XX-内核架构:AURIX TriCore 1.6P1、AURIX TC1.6P内核简介及特点2、AURIX TC1.6P系统组成及框架2.1、AURIX TC1.6P CPU 具体实现图如下:2.2、AURIX TC1.6P CPU 系统框架2.2.1、指令获取单元- Instruction Fetch Unit2.2.2、执行单元-…

SpringSession+Redis实现【分布式Session】

1. 什么是Spring Session SpringBoot整合Spring-Session的自动配置可谓是开箱即用,极其简洁和方便。这篇文章即介绍SpringBoot整合Spring-Session,这里只介绍基于RedisSession的实战。 Spring Session 是Spring家族中的一个子项目,Spring S…

公务员考试要求及流程梳理

背景 虽然我不考, 但考公这么热门, 在信息层面不能落伍. 本文以 浙江2023省考 (考试时间在2022年12月) 为例, 主要梳理 怎么报名, 选职位, 考试科目与题型, 录用流程等. 为什么考公/考编这么热 因为当下的社会环境对员工太不友好了: 工作强度大, 精神压力大, 还有硬性比例淘…

频率调优(调频)

文章目录 前言 1 频率调优步骤 1.1 准备工作 1.2 串行模式微调 1.3 PPM模式微调 2 高级用户 前言 某些协议需要调优以获得最佳性能。在某些情况下,需要调优才能绑定协议。频率调优是每个 MULTI 模块所特有的,是由于射频组件的微小变化引起的。 &#xf…

物联网通信技术 第6章 电信网络

6.5 多网融合 从通信网络来讲,多网融合主要是指固定网络、移动网络、互联网、广电网融合于一体,满足通信业务融合、网络融合、终端融合、产业融合的需求。 “多网融合”技术有两个层面的含义,一是基于IP协议的控制网与信息网的“接入融合”…

电巢:千亿美金砸向半导体,印度能否实现“赶中超美”的野心?

前言 印度,又一次开始向半导体产业进军。 近日,印度最大集团公司塔塔集团(Tata Group)旗下子公司塔塔之子董事长纳塔拉詹钱德拉塞卡兰(Natarajan Chandrasekaran),在接受媒体采访时表示,塔塔集团将开始在印…

戴尔电脑录屏怎么录?这3个方法,教你轻松录屏

随着互联网的发展,电脑已经成为我们学习、工作和娱乐中不可或缺的工具。很多人在使用戴尔电脑的时候,经常会遇到需要进行录屏的情况。戴尔电脑录屏怎么录?小伙伴还在担心自己不会使用戴尔电脑录屏而烦恼吗?今天小编给大家带来了3个…

DVWA靶场安装

DVWA靶场安装1.环境准备2.安装步骤2.1.phpstudy安装2.2.DVWA安装2.2.1.下载DVWA2.2.2.解压DVWA2.2.3.放入服务器2.2.4.删除配置文件后缀2.2.5.修改配置文件2.2.6.访问DVWA2.2.7.报错修改2.2.8.修改php.ini2.2.9.重新访问DVWA2.2.10.登录DVWA3.修改过关等级1.环境准备 服务器环境…

redux与vuex异同以及使用

一. 概述 React与Vue是我们熟悉的两大前端主流框架,来自官方的解释,Vue是一套用于构建用户界面的渐进式框架,React是一个用于构建用户界面的JavaScript库,两个框架都使用各自的语法,专注于用户UI界面的构建.那我们会有疑问,这两个框架都专注于…

PAG动画研究

阅读文章大约需要6分钟 一、什么是PAG 官方定义:PAG(Portable Animated Graphics) 是一套完整的动画工作流。提供从AE导出插件,到桌面预览工具PAGViewer,再到各端的跨平台渲染 SDK。 二、PAG的优势 1、动画文件小&a…

[附源码]Python计算机毕业设计工程车辆动力电池管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

【DevOps实战系列】第四章:详解Jenkins搭建及使用

个人亲自录制全套DevOps系列实战教程 :手把手教你玩转DevOps全栈技术 Jenkins概述 根据jenkins官网对自己的描述,它是一个可集成有1800插件的自动化服务, 提供构建、部署和自动化的工程,可以说是opsdev的大总管,将开发…

zabbix部署+报警模块+图形模块+管理模块+添加监控模板

目录 安装zabbix 部署zabbix 配置zabbix 1. 修改语言 2. 监控linux端 3. 修改中文乱码 报警功能 报警音报警 邮件报警 脚本报警 邮件通知内容 图形模块 创建图形 创建聚合图形 percona mysql模板 nginx模板 克隆主机 网络发现 自动注册 主被动模式 🍁如果对你有帮助…

Vue + Element-ui实现后台管理系统---项目搭建 + ⾸⻚布局实现

目录:导读 项目搭建 ⾸⻚布局实现 一、项目搭建 1、环境搭建 2、项目初期搭建 二、Main.vue 三、左侧栏部分(CommonAside.vue) 四、header部分(CommonHeader.vue) 五、Home.vue 写在最后 项目搭建 ⾸⻚布局实现 这篇主要讲解 项目搭建 后台⾸⻚布局实现…