Kevin Markham,数据科学讲师,2002 年,毕业于范德堡大学,计算机工程学士,2014 年,创建了 Data School,在线教授 Python 数据科学课程,他的课程主要包括 Pandas、Scikit-learn、Kaggle 竞赛数据科学、机器学习、自然语言处理等内容,迄今为止,浏览量在油管上已经超过 500 万次。
目录
文末有 Jupyter Notebook 下载,正文先上图。 0. 使用的数据集原文的数据集是 bit.ly 短网址的,我这里在读取时出问题,不稳定,就帮大家下载下来,统一放到了 data 目录里。
本文中采用让数据集主要为常见的酒水饮料、IMDB 电影、泰坦尼克号、飞碟目击等数据集。 这里需要注意的是: 1)
1. 查看 pandas 及其支持项的版本使用 查看所有 pandas 的支持项版本,使用 2. 创建 DataFrame创建 DataFrame 的方式有很多,比如,可以把字典传递给 DataFrame 构建器,字典的 Key 是列名,字典的 Value 为列表,是 DataFrame 的列的值。 如果 DataFrame 的数据较多,用字典的方式就不合适了,需要输入的东西太多。这时,可以用 Numpy 的 这样就可以生成 DataFrame 了,但如果要用非数字形式的列名,需要强制把字符串转换为列表, 再把这个列表传给 这里要注意的是,字符串里的字符数量必须与 DataFrame 的列数一致。 3. 重命名列用点(
这种方式的优点是可以重命名任意数量的列,一列、多列、所有列都可以。 还有一种简单的方式可以一次性重命名所有列,即,直接为列的属性赋值。 只想替换列名里的空格,还有更简单的操作,直接用 以上这三种方式都可以更改列名。 用 4. 反转列序反转 这个数据集按国家列出了酒水平均消耗量,如果想反转列序该怎么办? 最直接的方式是把 如果想让索引从 0 到 1,用 这样,行序就已经反转过来了,索引也重置为默认索引。 5. 反转列序与反转行序类似,还可以用 逗号前面的分号表示选择所有行,逗号后面的 6. 按数据类型选择列首先,查看一下 drinks 的数据类型: 选择所有数值型的列,用 同样的方法,还可以选择所有字符型的列。 同理,还可以用 传递列表即可选择多种类型的列。 还可以使用 7. 把字符串转换为数值再创建一个新的 DataFrame 示例。 这个 DataFrame 里的数字其实是以字符串形式保存的,因此,列类型是 要想执行数学计算,要先把这些列的数据类型转换为数值型,下面的代码用 用这种方式转换第三列会出错,因为这列里包含一个代表 0 的下划线,pandas 无法自动判断这个下划线。 为了解决这个问题,可以使用
一行代码就可以解决这个问题,现在所有列的值都转成 8. 优化 DataFrame 对内存的占用pandas 的 DataFrame 设计的目标是把数据存到内存里,有时要缩减 DataFrame 的大小,减少对内存的占用。 下面显示了 drinks 占用的内存。 这里显示 drinks 使用了 30.5 KB 内存。 大型 DataFrame 会影响计算性能,甚至导致 DataFrame 读入内存失败,下面介绍简单几步,即可在读取 DataFrame 时减少内存占用。 第一步是只读取切实所需的列,这里需要指定 只选择两列以后,DataFrame 对内存的占用减少到 13.7 KB。 第二步是把包含类别型数据的 object 列转换为 Category 数据类型,通过指定 把 continent 列改为 category 数据类型后,DataFrame 对内存的占用进一步缩减到 2.4 KB。 注意:类别数量相对于行数较少时,category 数据类型对对内存占用的减少会比较有限。 9. 用多个文件建立 DataFrame ~ 按行本段介绍怎样把分散于多个文件的数据集读取为一个 DataFrame。 比如,有多个 stock 文件,每个 CSV 文件里只存储一天的数据。 下面是三天的股票数据: 把每个 CSV 文件读取成 DataFrame,合并后,再删除导入的原始 DataFrame,但这种方式占用内存太多,而且要写很多代码。 使用 Python 内置的 把文件名规则传递给 本例里,
调用 注:原文里用的是 生成的 DataFrame 索引有重复值,见 “0、1、2”。为避免这种情况,要在 10. 用多个文件建立 DataFrame ~ 按列上个技巧按行合并数据集,但是如果多个文件包含不同的列,该怎么办? 本例将 drinks 数据集分为了两个 CSV 文件,每个文件都包含 3 列。 与上例一样,还是使用 这里要让 现在 drinks 有 6 列啦! 11. 从剪贴板创建 DataFrame想快速把 Excel 或别的表格软件里存储的数据读取为 DataFrame,用 打开要复制的 Excel 文件,选取内容,复制。 与
真不错!pandas 自动把第一列当设置成索引了。 注意:因为不能复用、重现,不推荐在正式代码里使用 12. 把 DataFrame 分割为两个随机子集把 DataFrame 分为两个随机子集,一个占 75% 的数据量,另一个是剩下的 25%。 以 Movies 为例,该数据有 979 条记录。 使用 使用 两个 DataFrame 的行数之和与 movies 一致。 movies_1 与 movies_2 里的每个索引值都来自于 movies,而且互不重复。 注意:如果索引值有重复、不唯一,这种方式会失效。 13. 根据多个类别筛选 DataFrame预览 movies。 查看 genre(电影类型)列。 要是想筛选 Action(动作片)、Drama(剧情片)、Western(西部片),可以用 不过,用 如果想反选,可在条件前添加一个波浪符(tilde ~)。 14. 根据最大的类别筛选 DataFrame筛选电影类别里(genre)数量最多的三类电影。 先用 使用 Series 的 这里所需的只是这个 Series 的 index。 把这个 index 传递给 最终,这个 DataFrame 里就只剩下了剧情片、喜剧片与动作片。 15. 处理缺失值本例使用目击 UFO 数据集。 可以看到,这个数据集里有缺失值。 要查看每列有多少缺失值,可以使用
还可以用 用 只想删除列中缺失值高于 10% 的缺失值,可以设置 16. 把字符串分割为多列创建一个 DataFrame 示例。 把姓名列分为姓与名两列,用 通过赋值语句,把这两列添加到原 DataFrame。 如果想分割字符串,但只想保留分割结果的一列,该怎么操作? 要是只想保留城市列,可以选择只把城市加到 DataFrame 里。 17. 把 Series 里的列表转换为 DataFrame创建一个 DataFrame 示例。 这里包含了两列,第二列包含的是 Python 整数列表。 要把第二列转为 DataFrame,在第二列上使用 用 18. 用多个函数聚合先看一下 Chipotle 连锁餐馆的 DataFrame。 每个订单都有订单号(order_id),每个订单有多行。要统计每个订单的金额,需要先根据每个 order_id 汇总每个订单里各个产品(item_price)的金额。下面的例子列出了订单号为 1 的总价。 计算每单的总价,要按 有时,要用多个聚合函数,不一定只是 上列就算出了每个订单的总价与订单里的产品数量。 19. 用一个 DataFrame 合并聚合的输出结果本例用的还是 orders。 如果想新增一列,为每行列出订单的总价,要怎么操作?上面介绍过用
要解决这个问题得用 接下来,为 DataFrame 新增一列, 如上所示,每一行都列出了对应的订单总价。 这样一来,计算每行产品占订单总价的百分比就易如反掌了。 20. 选择行与列本例使用大家都看腻了的泰坦尼克数据集。 这个数据集包括了泰坦尼克乘客的基本信息以及是否逃生的数据。 用 这个结果集显示的数据很多,但不一定都是你需要的,可能只需要其中几行。 还可以只选择部分列。 21. 重塑多重索引 Series泰坦尼克数据集里有一列标注了幸存(Survived)状态,值用 0、1 代表。计算该列的平均值可以计算整体幸存率。 按性别(Sex)统计男女的幸存率,需要使用 要按性别与舱型(Pclass)统计幸存率,就要按性别与舱型进行 上面显示了不同性别,不同舱型的幸存率,输出结果是一个多重索引的序列(Series),这种形式与实际数据相比多了多重索引。 这种表现形式不利于阅读,也不方便实现数据交互,用 这个 DataFrame 包含的数据与多重索引序列一模一样,只是可以用大家更熟悉的 DataFrame 方法进行操控。 22. 创建透视表经常输出类似上例的 DataFrame, 使用透视表,可以直接指定索引、数据列、值与聚合函数。 设置 此表显示了整体幸存率,及按性别与舱型划分的幸存率。 把聚合函数 这里显示了每个类别的记录数。 23. 把连续型数据转换为类型数据下面看一下泰坦尼克数据集的年龄(Age)列。 这一列是连续型数据,如果想把它转换为类别型数据怎么办? 这里可以用 这段代码为不同分箱提供了标签,年龄在 0-18 岁的为儿童,18-25 岁的为青年,25-99 岁的为成人。 注意:现在数据已经是类别型了,类别型数据会自动排序。 24. 改变显示选项接下来还是看泰坦尼克数据集。 年龄列有 1 位小数,票价列有 4 位小数,如何将这两列显示的小数位数标准化? 用以下代码让这两列只显示 2 位小数。 第一个参数是要设置的选项名称,第二个参数是 Python 的字符串格式。 现在年龄与票价列为 2 位小数了。 注意:这种操作不改变底层数据,只改变数据的显示形式。 还可以用以下代码重置数据显示选项。
注意:使用同样的方式,还可以设置更多选项。 25. 设置 DataFrame 样式上面的技巧适用于调整整个 Jupyter Notebook 的显示内容。 不过,要想为某个 DataFrame 设定指定的样式,pandas 还提供了更灵活的方式。 下面看一下 stocks。 创建样式字符字典,指定每列使用的格式。 把这个字典传递给 DataFrame 的 注意:日期是月-日-年的格式,闭市价有美元符,交易量有千分号。 接下来用链式方法实现更多样式。 可以看到,这个表隐藏了索引,闭市价最小值用红色显示,最大值用浅绿色显示。 再看一下背景色渐变的样式。 交易量(Volume)列现在按不同深浅的蓝色显示,一眼就能看出来数据的大小。 下面看最后一个例子。 本例的 DataFrame 加上了标题,交易量列使用了迷你条形图。 注意:Pandas 还支持更多 DataFrame 样式选项,详见 pandas 官方文档。 彩蛋:预览 DataFrame假如刚拿到一个数据集,想快速了解该数据集,又不想费劲折腾怎么办?这里介绍一个独立的支持库,pandas_profiling,可以快速预览数据集。 第一步,安装, 第二步,导入, 本例简单介绍一下
|
|