PyCon 大咖亲传 pandas 25 式

640?wx_fmt=other

Kevin Markham,数据科学讲师,2002 年,毕业于范德堡大学,计算机工程学士,2014 年,创建了 Data School,在线教授 Python 数据科学课程,他的课程主要包括 Pandas、Scikit-learn、Kaggle 竞赛数据科学、机器学习、自然语言处理等内容,迄今为止,浏览量在油管上已经超过 500 万次。

640?wx_fmt=other

Kevin 还是 PyCon 培训讲师,主要培训课程如下:


  • PyCon 2016,用 Scikit-learn 机器学习技术处理文本

  • PyCon 2018,如何用 Pandas 更好(或更糟)地实现数据科学

  • PyCon 2019,Pandas 数据科学最佳实践


本文基于 Kevin 于 2019 年 7 月推出的最新视频教程,汇总了他 5 年来最喜欢的 25 个 pandas 操作技巧,希望大家喜欢。

640?wx_fmt=other

目录

  1. 查看 pandas 及其支持项的版本

  2. 创建 DataFrame

  3. 重命名列

  4. 反转行序

  5. 反转列序

  6. 按数据类型选择列

  7. 把字符串转换为数值

  8. 优化 DataFrame 大小

  9. 用多个文件建立 DataFrame ~ 按行

  10. 用多个文件建立 DataFrame ~ 按列

  11. 从剪贴板创建 DataFrame

  12. 把 DataFrame 分割为两个随机子集

  13. 根据多个类别筛选 DataFrame

  14. 根据最大的类别筛选 DataFrame

  15. 操控缺失值

  16. 把字符串分割为多列

  17. 把 Series 里的列表转换为 DataFrame

  18. 用多个函数聚合

  19. 用一个 DataFrame 合并聚合的输出结果

  20. 选择行与列

  21. 重塑多重索引 Series

  22. 创建透视表

  23. 把连续型数据转换为类别型数据

  24. 改变显示选项

  25. 设置 DataFrame 样式

  26. 彩蛋:预览 DataFrame

文末有 Jupyter Notebook 下载,正文先上图。


0. 使用的数据集


原文的数据集是 bit.ly 短网址的,我这里在读取时出问题,不稳定,就帮大家下载下来,统一放到了 data 目录里。

 
 

本文中采用让数据集主要为常见的酒水饮料、IMDB 电影、泰坦尼克号、飞碟目击等数据集。

这里需要注意的是:

1) pd.read_csv('data/chipotle.tsv', sep=' ') 里的 chipotle.tsv,是用 tab 作为分隔符的,所以要增加参数 sep=

orders.item_price.str.replace('$', '').astype('float')item_price 列是带 $ 的文本,要用 .str.replace('$', '').astype('float') 去掉 $,再把该列数据类型改为 float

ufo.csv里的 Time 列,要用 parse_dates=['Time']),解析日期。

1. 查看 pandas 及其支持项的版本


使用 pd.__version__ 查看 pandas 的版本。

640?wx_fmt=other

查看所有 pandas 的支持项版本,使用 show_versions 函数。比如,查看 Python、pandas、Numpy、matplotlib 等支持项的版本。

640?wx_fmt=other

2. 创建 DataFrame


创建 DataFrame 的方式有很多,比如,可以把字典传递给 DataFrame 构建器,字典的 Key 是列名,字典的 Value 为列表,是 DataFrame 的列的值。

640?wx_fmt=other

如果 DataFrame 的数据较多,用字典的方式就不合适了,需要输入的东西太多。这时,可以用 Numpy 的 random.rand() 函数,设定行数与列数,然后把值传递给 DataFrame 构建器。

640?wx_fmt=other

这样就可以生成 DataFrame 了,但如果要用非数字形式的列名,需要强制把字符串转换为列表, 再把这个列表传给 columns 参数。

640?wx_fmt=other

这里要注意的是,字符串里的字符数量必须与 DataFrame 的列数一致。

3. 重命名列


640?wx_fmt=other

用点(.)选择 pandas 里的列写起来比较容易,但列名里有空格,就没法这样操作了。

rename()方法改列名是最灵活的方式,它的参数是字典,字典的 Key 是原列名,值是新列名,还可以指定轴向(axis)。

640?wx_fmt=other

这种方式的优点是可以重命名任意数量的列,一列、多列、所有列都可以。

还有一种简单的方式可以一次性重命名所有列,即,直接为列的属性赋值。

640?wx_fmt=other

只想替换列名里的空格,还有更简单的操作,直接用 str.replace 方法,不必把所有的列名都敲一遍。

640?wx_fmt=other

以上这三种方式都可以更改列名。

用 add_prefix 与 add_suffix 函数可以为所有列名添加前缀后缀

640?wx_fmt=other

640?wx_fmt=other


4. 反转列序

反转 drinks 表的顺序。

640?wx_fmt=other

这个数据集按国家列出了酒水平均消耗量,如果想反转列序该怎么办?

最直接的方式是把 ::-1 传递给 loc 访问器,与 Python 里反转列表的切片法一样。

640?wx_fmt=other

如果想让索引从 0 到 1,用 reset_index()方法,并用 drop 关键字去掉原有索引。

640?wx_fmt=other

这样,行序就已经反转过来了,索引也重置为默认索引。

5. 反转列序

与反转行序类似,还可以用 loc 从左到右反转列序。

640?wx_fmt=other

逗号前面的分号表示选择所有行,逗号后面的 ::-1 表示反转列,这样一来,country 列就跑到最右边去了。

6. 按数据类型选择列


首先,查看一下 drinks 的数据类型:

640?wx_fmt=other

选择所有数值型的列,用 selec_dtypes() 方法。

640?wx_fmt=other

同样的方法,还可以选择所有字符型的列。

640?wx_fmt=other

同理,还可以用 datetime 选择日期型的列。

传递列表即可选择多种类型的列。

640?wx_fmt=other

还可以使用 exclude 关键字排除指定的数据类型。

640?wx_fmt=other


7. 把字符串转换为数值


再创建一个新的 DataFrame 示例。

640?wx_fmt=other

这个 DataFrame 里的数字其实是以字符串形式保存的,因此,列类型是 object

640?wx_fmt=other

要想执行数学计算,要先把这些列的数据类型转换为数值型,下面的代码用 astype() 方法把前两列的数据类型转化为 float

640?wx_fmt=other

用这种方式转换第三列会出错,因为这列里包含一个代表 0 的下划线,pandas 无法自动判断这个下划线。

为了解决这个问题,可以使用 to_numeric() 函数来处理第三列,让 pandas 把任意无效输入转为 NaN

640?wx_fmt=other


NaN 代表的是 0,可以用 fillna() 方法填充。

640?wx_fmt=other

一行代码就可以解决这个问题,现在所有列的值都转成 float 了。

640?wx_fmt=other


8. 优化 DataFrame 对内存的占用


pandas 的 DataFrame 设计的目标是把数据存到内存里,有时要缩减 DataFrame 的大小,减少对内存的占用。

下面显示了 drinks 占用的内存。

640?wx_fmt=other

这里显示 drinks 使用了 30.5 KB 内存。

大型 DataFrame 会影响计算性能,甚至导致 DataFrame 读入内存失败,下面介绍简单几步,即可在读取 DataFrame 时减少内存占用。

第一步是只读取切实所需的列,这里需要指定 usecols 参数。

640?wx_fmt=other

只选择两列以后,DataFrame 对内存的占用减少到 13.7 KB。

第二步是把包含类别型数据的 object 列转换为 Category 数据类型,通过指定 dtype 参数实现。

640?wx_fmt=other

把 continent 列改为 category 数据类型后,DataFrame 对内存的占用进一步缩减到 2.4 KB。

注意:类别数量相对于行数较少时,category 数据类型对对内存占用的减少会比较有限。

9. 用多个文件建立 DataFrame ~ 按行


本段介绍怎样把分散于多个文件的数据集读取为一个 DataFrame。

比如,有多个 stock 文件,每个 CSV 文件里只存储一天的数据。

下面是三天的股票数据:

640?wx_fmt=other

把每个 CSV 文件读取成 DataFrame,合并后,再删除导入的原始 DataFrame,但这种方式占用内存太多,而且要写很多代码。

使用 Python 内置的 glob 更方便。

640?wx_fmt=other

把文件名规则传递给 glob(),这里包括通配符,即可返回包含所有合规文件名的列表。

本例里,glob 会查找 data 子目录里所有以 stocks 开头的 CSV 文件。

640?wx_fmt=other

glob 返回的是无序文件名,要用 Python 内置的 sorted() 函数排序列表。

调用 read_csv() 函数读取生成器表达式里的每个文件,把读取结果传递给 concat() 函数,然后合并为一个 DataFrame。

注:原文里用的是 stock_files = sorted(glob('data/stocks*.csv')),译文里没用 stocks*,用的是 stocks?,这是因为 data 目录里还有一个叫 stocks.csv 的文件,如果用 *,会读取出 4 个文件,而不是原文中的 3 个文件。

640?wx_fmt=other

生成的 DataFrame 索引有重复值,见 “0、1、2”。为避免这种情况,要在 concat() 函数里用忽略旧索引、重置新索引的参数,ignore_index = True

640?wx_fmt=other


10. 用多个文件建立 DataFrame ~ 按列

上个技巧按行合并数据集,但是如果多个文件包含不同的列,该怎么办?

本例将 drinks 数据集分为了两个 CSV 文件,每个文件都包含 3 列。

640?wx_fmt=other

与上例一样,还是使用 glob()

640?wx_fmt=other

这里要让 concat() 函数按列合并,axis='columns

640?wx_fmt=other

现在 drinks 有 6 列啦!

11. 从剪贴板创建 DataFrame


想快速把 Excel 或别的表格软件里存储的数据读取为 DataFrame,用 read_clipboard()函数。

640?wx_fmt=other

打开要复制的 Excel 文件,选取内容,复制。

640?wx_fmt=other

与 read_csv() 函数类似,

read_clipboard() 会自动检测列名与每列的数据类型。

640?wx_fmt=other

640?wx_fmt=other

真不错!pandas 自动把第一列当设置成索引了。

640?wx_fmt=other

注意:因为不能复用、重现,不推荐在正式代码里使用 read_clipboard() 函数。

12. 把 DataFrame 分割为两个随机子集


把 DataFrame 分为两个随机子集,一个占 75% 的数据量,另一个是剩下的 25%。

以 Movies 为例,该数据有 979 条记录。

640?wx_fmt=other

使用 sample()方法随机选择 75% 的记录,并将之赋值给 moives_1

640?wx_fmt=other

使用 drop() 方法删掉 movies 里所有 movies_1,并将之赋值给 movies_2

640?wx_fmt=other

两个 DataFrame 的行数之和与 movies 一致。

640?wx_fmt=other


movies_1 与 movies_2 里的每个索引值都来自于 movies,而且互不重复。

640?wx_fmt=other

注意:如果索引值有重复、不唯一,这种方式会失效。

13. 根据多个类别筛选 DataFrame


预览 movies

640?wx_fmt=other

查看 genre(电影类型)列。

640?wx_fmt=other

要是想筛选 Action(动作片)、Drama(剧情片)、Western(西部片),可以用 or 的操作符实现多条件筛选。

640?wx_fmt=other

不过,用 isin() 方法筛选会更清晰,只要传递电影类型的列表就可以了。

640?wx_fmt=other

如果想反选,可在条件前添加一个波浪符(tilde ~)。

640?wx_fmt=png

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值