百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

excel数据处理需求,透视表无法解决?用Python吧

off999 2024-09-16 00:40 43 浏览 0 评论

请关注本号,后续会有更多相关教程。转发本文并私信我"python",即可获得按水平领域分类好的Python资料

系列文章

  1. "替代Excel Vba"系列(一):用Python的pandas快速汇总
  2. "Python替代Excel Vba"系列(二):pandas分组统计与操作Excel

前言

本系列前2篇已经稍微展示了 python 在数据处理方面的强大能力,这主要得益于 pandas 包的各种灵活处理方式。

但是身经百战的你肯定会觉得,前2篇例子中的数据太规范了,如果把数据导入到数据库还是可以方便解决问题的。

因此,本文将使用稍微复杂的数据做演示,充分说明 pandas 是如何灵活处理各种数据。

本文要点:

  • 使用 pandas 处理不规范数据。
  • pandas 中的索引。

注意:虽然本文是"Python替代Excel Vba"系列,但希望各位读者明白,工具都是各有所长,选择适合的工具,才是最好的。


案例

这次的数据是一个教师课程表。如下图:

  • 其中表格中的第3行是班级。诸如"一1",表示是一年级1班,最多8个年级。
  • 表格中的1至3列,分别表示"星期"、"上下午"、"第几节课"。
  • 前2列有大量的合并单元格,并且数据量不一致。比如星期一有9行,但星期二却只有7行。
  • 表格的主要内容是,每天每个班级的每堂课是什么课以及是哪位教师负责。诸如"语文xxx",表示这是语文课,由xxx老师负责。这里的名字按照原有数据做了脱敏。

这是典型的报表输出格式,其中有合并单元格,内容把科目和人名回到一起去。由于案例原有的需求比较繁琐,本文核心是处理数据,因此简化了需求。

不管我们的分析目的是什么,第一步就是要把这份数据整理好,才能应对各种分析。我们开始吧。


导入包

本文所需的包,安装命令如下:

pip install xlwings
pip install pandas
pip install numpy

建议你安装 anaconda ,那么最难安装的 pandas 和 numpy 都不会是问题。

脚本中导入


设定目标数据格式

我们需要得到最小维度的数据格式,即每天每个班的每节课是哪位老师负责的哪个科目。如下:

为了管理方便,下面会把每个环节的处理放入一个独立的方法中


加载数据

代码如下:

  • 由于这次的标题是从第3行开始,因此 wrk.range('a3').current_region 会导致内容包含了前2行。
  • .options(np.array),因此我们把整块数据加载到 numpy 的数组中。numpy 数组可以很方便做各种切片。
  • header=arr[2] , 取出第3行作为标题。注意索引是从0开始算。
  • values=arr[3:],从第4行往后一大片作为值。
  • pd.DataFrame(values,columns=header) , 生成一个 DataFrame 。
  • .replace(['/','nan'],np.nan),把读取进来的有些无效值替换为 nan,这是为了后续操作方便。

我们来看看数据:

  • 注意看左上角有3个 nan ,是因为表格的标题行前3列是空的。
  • 由于前2列有合并单元格,出现了很多 nan。
  • 此外注意看第3列,把课时序号显示成小数。

处理标题

pandas 的 DataFrame 最大的好处是,我们可以使用列名字操作数据,这样子就无需担心列的位置变化。因此需要把标题处理好。 代码如下:

  • cols=df.columns.tolist(),把 df 的字段拿出来。这是一个list
  • cols[:3]=['day','apm','num'] ,把列表的前3项的 nan ,替换成我们需要的字段名字。
  • df.columns=cols , 表示更新 df 的字段
  • df['num'].astype('float').astype('int') ,顺手把 num 字段的小数变整数。这里不能直接转整数,因为 python 怕有精度丢失,直接转换 int 会报错。因此先转 float,再转 int。

再次看看 数据,一切正常:


填充缺失

下一步就是把前2列的 nan 给填充正确。

  • df[cols]=df[cols].fillna(method='ffill') , fillna 方法即可填充 nan 。此外 pandas 中有各种内置的填充方式。 ffill 表示用上一个有效值填充。
  • 合并单元格很多时候就是第一个有值,其他为空,ffill 填充方式刚好适合这样的情况。

现在数据美如画了。

重塑

要理解 pandas 中的重塑,先要了解 DataFrame 的构成。 如下是一个 DataFrame 的组成部分:

  • 红框中的是 DataFrame 的值部分(values)
  • 上方深蓝色框中是 DataFrame 的列索引(columns),注意,为什么方框不是一行?是因为 DataFrame 允许多层次索引。类似于平时的复合表头。
  • 左方深蓝色框中是 DataFrame 的行索引(index)。本质上是与列索引一致,只是 index 用于定位行,columns 用于定位列。

不要被"多层次索引"这种词汇吓到,其实是我们经常遇到的东西。 下面来看看一个多层次索引的例子:

  • 上图的上方有3个层次的列索引,依次从上到下。
  • 上图的左方有2个层次的行索引,依次从左到右。
  • 我们平时操作 DataFrame 就是通过这两个玩意去定位里面的数据。

如果你熟悉 excel 中的透视表,那么完全可以把行列索引当作是透视表中的行列区域。


理解了索引,那么就要说一下如何变换行列索引。 pandas 中通过 stack 方法,可以把需要的列索引转成行索引。 用上面的数据作为例子,我们需要左边的行索引显示每天上下午的气温和降雨量。如下图:

  • 不妨在 excel 的透视表上操作一下,把一个放入列区域的字段移到行区域上,就是上图的结果。

回到我们的例子。我们需要把前3列放入行索引,然后把整个列索引移到行索引上。 代码如下:

  • .set_index(['day','apm','num']) , 把这3列放入行索引区域。
  • .stack() ,stack 方法默认把最后的列索引区域的最后一个列索引,移到行索引区域的最后。由于目前的 df 只有一个列索引,因此直接调用 stack 即可。
  • 此时,由于把唯一的列索引移走了,df 已经没有任何列索引!
  • .reset_index(-1) , 把最后的行索引移走,并成为单独的一列。
  • 到此,df 又重新有了一层列索引。

看看现在的数据,如下:


剩下的工作则非常简单,主要是把班级和内容分成2列。


数据如下:


最后

本文通过实例展示了如何在 Python 中使用 xlwings + pandas 灵活处理各种的不规范格式表格数据。这种方式尤其适合报表形式的数据。

[源码地址](https://github.com/CrystalWindSnake/Creative/tree/master/python/excel_pandas/3)

请关注本号,后续会有更多相关教程。

相关推荐

u盘闪迪好还是金士顿好(金士顿和闪迪谁寿命长)

u盘金士顿好一些。金士顿的最大优点就是它的主控一般都是群联的,而此主控都有对应的量产工具,很多时候就算过了保质期,U盘不论出什么故障,只要硬件没坏就可以用量产工具来修复好继续用。而且就算某些金士顿主控...

深度ghost win10系统(deep ghost win10)

不能说绝对.要分两种情况:当win10安装时,如果采用了GPT分区硬盘格式(现在大多数新电脑都支持这个格式,并默认是这种方式),或者是由win10自动分区安装,均分产生一个额外的引导分区,容量比较少,...

win8专业版和家庭版的区别(win8专业版和家庭版的区别在哪)

win10有七种版本:家庭版、企业版、教育版、移动版、移动企业版以及针对物联网设备及嵌入式系统设计的版本。据个人理解家庭版与家庭中文版是一个意思,是家庭版的不同语言版本,你升级的时候,会自动升级到对应...

手机开不了机怎么办一直黑屏

原因可能有很多:系统崩溃。刷机失败,手机电池用尽。可以通过以下方法检测:1.首先,对手机进行自我检测。现在大多数品牌手机都有深度休眠模式,一旦进入这种模式,经常会造成手机黑屏,无法开机。解决的...

主题商店官方下载(vivi主题商店下载)

1首先上小米官网注册设计师账号您可以登录主题设计师站上传。designer.xiaomi.com/2下载小米主题制作器3打包成mtz格式4上传等待审核(如果只是自己用的话就不用上传)在软件商店里搜...

360邮箱登录(360邮箱登录入口在哪里)

可以修改登录邮箱的,不自己亲自尝试一下,还真是觉的好麻烦,尤其是在你要修改的邮箱已经被注册的时候,如果你知道了,就很简单,不知道的,希望你再修改的时候不要多走弯路,下面我给大家详细讲解。1首先,我们要...

win10自动更新后桌面文件全没了

打开控制面板,找到用户账户,看看有几个账户。如果有多个账户,则重新启动计算机,登录另一个账户,看看桌面文件是否回来了。以上方法未成功,则在整个电脑里搜索以前的那个文件夹。搜索也找不到,就下载并安装一个...

三星固态硬盘(三星固态硬盘序列号查询官网)

您可以通过访问三星官方网站的支持页面来查询三星固态硬盘的序列号。在支持页面中,您可以找到一个名为"产品注册"或"产品查询"的选项。点击该选项后,您将被要求输入您的固态硬...

手机恢复出厂设置后数据能恢复吗

1、首先来说如果点击了“恢复出厂设置”朋友们完全不用惊慌,因为手机上的数据还是能够找回来的。2、在网上找一款免费的手机恢复数据软件,例如安卓上的应用手机数据恢复精灵,根据手机恢复数据软件向导式提醒进行...

万能浏览器手机版下载安装(万能浏览器手机版下载安装最新版)

用起来还是挺靠谱的,但是可能会有捆绑的恶意软件,各种弹窗很烦人OPPO手机浏览器搜索网站的方法:在页面顶部的搜索栏输入URL或搜索关键字。搜索栏下会出现搜索建议,可直接点击符合你搜索目标的建议。点击搜...

windows彻底关闭自动更新(关闭windows 自动更新)

方法一:Windows设置  要想关闭Win10自动更新,比较简单的一种方法就是进入到Windows设置中,将Windows更新直接关闭。步骤如下:  1、按“Windows+I”键,打开Wind...

potplayer安卓版官网(potplayer apk下载)

教程如下:Potplayer是一款非常强大的媒体播放器,是由原KMPlayer的制作者自己开发的,软件体积小,功能强大,占用内存非常小,其软件内置解码器几乎能播放任何格式的媒体文件,而且软件本身没有任...

十大公认最耐用的台式电脑(哪个品牌的台式机电脑最耐用)
十大公认最耐用的台式电脑(哪个品牌的台式机电脑最耐用)

一般来说,品牌机没有单卖的,都是成套的主机显示器一起销售的,如果价格不是问题,单说耐用,个人感觉还是IBM的耐用,再其次什么戴尔,联想,华硕,宏碁什么的也都可以。惠普台式电脑和戴尔台式电脑相比较,肯定是戴尔台式电脑的质量比较好,因为戴尔台...

2025-12-13 13:03 off999

360下载的软件不在桌面上(电脑下载360为什么不在桌面)

方法如下。打开360浏览器的设置按钮,在设置中选择将下载的文件浏览到桌面,点击应用保存,这是即可将360文件下载的内容直接储存到桌面上。可以选择F3进行搜索,搜到360浏览器之后打开他的这个文件夹,找...

电脑读不了u盘怎么回事(电脑读不出u盘了)

方法1:取消勾选“隐藏的驱动器”  1、首先要排除是不是U盘损坏的问题,当U盘插入到其他电脑,如果可以读出来,那么肯定不是U盘的问题了。  2、很有可能是U盘在你的电脑上被隐藏了,将U盘插入电脑后,打...

取消回复欢迎 发表评论: