发现许多小伙伴入门Python几个月,还是低效率做数据处理。这套课程以形象的示意图,精心安排的案例,循序渐进带你玩转数据处理分析神器——pandas,课程中还有分析案例噢,干货满满!
前言
经过前2个阶段,22节课的学习,相信大家已经能够应用 pandas 解决一些实际问题。
不过,前2个阶段算是入门内容,主要让你了解 pandas 的整体概念及其常用方法。
你会发现这些方法中有许多参数,看着就一头雾水,接下来第3阶段我们将深入每个应用场景,详细讲解这些方法的使用,首先讲解的是数据加载相关知识。
多种数据来源
有小伙伴会问:这课程的数据不是 csv 文件就是 excel 文件了,pandas 还可以从其他类型的文件获取数据吗
实际上,pandas 支持的数据源非常多,有一些你可能都没想到,先看看他的数据源支持列表:
可以看到有3种大类(文本、二进制、SQL)
其中有许多我们很少听说的格式(Feather Format、Parquet Format)
不仅是 csv ,网页数据和 json 文件都可以直接加载,就连本地的剪切板都能支持
此外,由于 pandas 可以通过 python 内置数据结构(字典、列表等)来构造 DataFrame,因此即使是上述列表没有支持的格式(比如 xml),我们也同样可以结合其他第三方库轻松实现
本专栏会详细讲解的数据源如下:
excel
csv
Feather Format
SQL
本文先讲解 excel 相关的。
小伙伴:'这么简单的内容也需要讲解?不就是一个 read_excel 就搞定的事情吗'
其实这加载方式的方法都有许多参数,同时也有一些坑,我们开始吧
案例1:加载数据
小伙伴:加载数据这么简单也好意思说?
'看下去你就知道里面存在很多小技巧'
从一个 Excel 文件加载一个工作表到 DataFrame 是非常容易:
pd.read_excel('data/data_sp4.xlsx','1')
第一参数是文件的所在路径(绝对路径或相对路径)
第二参数是 Excel 文件中的工作表名字,注意,名字总是字符串
关于相对路径等知识,请查看我的'Python入门必备系列'文章 建议大家使用此方法的前2个参数时,不要把参数名字写出来,因为在旧版本的 pandas 中,第二参数的名字有所不同,有时候会出现难以查错的情况
小伙伴:那么如果需要加载一个 Excel 的2个工作表,是不是就要写2次pd.read_excel ?
pandas 当然不会这么折磨人,直接看看代码:
当第二参数传入字符串列表时,他会同时加载指定的工作表
结果是一个有顺序的字典
为什么要强调 字符串列表 ?因为你也可以通过位置来指定工作表,比如:[0,1] 表示加载第一个和第二个工作表。位置总是用 数值列表 表示
那怎么访问每个工作表的数据呢:
df['1'],你就当作是普通的字典即可,通过工作表名字即可获得对应的数据 DataFrame
小伙伴:好吧,这样也算方便,但是我现在需要整个文件所有的工作表,但我不知道他们的名字呀。
pandas 当然也考虑到这点:
当第二参数设置为 None 时,他会加载所有的工作表
案例2:表头不在首行
Excel 的数据格式经常会让你有惊喜,比如有一次同事给你一个如下的数据表:
表格的前2行是一个大标题,对我们来说是没有用的数据。
有效的标题行在第3行
前2列是空列
面对这样的数据,如果只是简单调用 pd.read_excel() ,只能得到如下的效果:
默认情况下,pandas 会把首行作为 DataFrame 的表头(columns),这是 header 参数的作用,其值默认为0,表示第1行(0表示第一行,1表示第二行,以此类推)
所有的列都被加载
我们可以通过简单设置 header 参数,让其把第3行作为表头:
设置 header = 2,表示使用第3行作为表头,pandas 会自动跳过前2行
案例3:只加载部分列的数据
但是,上一个例子中的前2列仍然是没用的空列,我们可以通过参数 usecols 完成任务:
设置 usecols=['日期', '销量'],让其只保留 日期 与 销量 2列
有人抬杠说到:有时候我也不知道具体列的表头名字,反正我就是要加载第3和第4列。如下:
注意此时的表头不是叫 '日期' 与 '销量'
我们同样可以通过 usecols 完成:
usecols=[2, 3],当这参数设置为数值列表时,他就知道你要的是指定位置的列
当 usecols 指定为字符串列表时,他会认为你要指定列名字(名字都是字符串呀)
此外,我们还可以通过 Excel 的列号指定:
usecols='C,D' ,当参数设置为单个字符串时,就认为是 Excel 的列号,这表示读取 C 和 D 列
如果你熟悉 Excel 的公式,此方式还可以设置区间,比如 'A,C:E',表示读取 A,C至E 列,总共4列数据
有一次小伙伴真遇到大难题了,他发现拿到的 Excel 数据的有效列的位置不是固定的,如下:
有可能需要的数据是在不同的列上
那么有没有一种方法可以不管列在哪里,都只加载有效的列呢?
既然这里有提出来,自然就有办法解决,先看看如果不指定参数 usecols 的情况:
前4列的第3行由于是空值,因此 pandas 会默认使用 Unnamed:序号 作为这些表头的名字
那么我们可以通过这个逻辑去把这些列去掉:
usecols=lambda n: n.find('Unnamed') < 0,当 usecols 是一个可执行的对象时(任何的方法或 lambda),那么 pandas 就会把列名字逐一输入到这个方法中,当方法执行结果为 True,则保留此列
n.find('Unnamed') ,n 就是列名字,是一个字符串,调用其 find 方法查找字符串 Unnamed ,如果找不到,则此方法返回 -1
因此,整个 usecols 设置的语义是:名字中找不到 Unnamed 的列 ,给我保留下来吧
看看如下示意图:
总结
本节重点掌握以下知识:
pd.read_excel ,前2个参数分别是 Excel 文件路径、数据所在工作表名字
header 参数指定表头位置
usecols 指定加载的列名字(也可以是位置或自定义逻辑)
pd.read_excel 方法实际有多达10+个参数,但实际上常用的参数不多,以后我找到他们的实战应用案例再分享。
下一节讲解输出 Excel 的知识,看看怎么解决 to_excel 方法覆盖原文件内容的问题