NumPy 和 Pandas 数据分析实用指南:1~6 全(上)https://developer.aliyun.com/article/1426750
四、Pandas 很有趣! 什么是 Pandas?
在之前的章节中,我们已经讨论过 NumPy。 现在让我们继续学习 pandas,这是一个经过精心设计的包,用于在 Python 中存储,管理和处理数据。 我们将从讨论什么是 Pandas 以及人们为什么使用 Pandas 开始本章。 接下来,我们将讨论 Pandas 提供的两个最重要的对象:序列和数据帧。 然后,我们将介绍如何子集您的数据。 在本章中,我们将简要概述什么是 Pandas 以及其受欢迎的原因。
Pandas 做什么?
pandas 向 Python 引入了两个关键对象,序列和数据帧,后者可能是最有用的,但是 pandas 数据帧可以认为是绑定在一起的序列。 序列是一序列数据,例如基本 Python 中的列表或一维 NumPy 数组。 而且,与 NumPy 数组一样,序列具有单个数据类型,但是用序列进行索引是不同的。 使用 NumPy 时,对行和列索引的控制不多; 但是对于一个序列,该序列中的每个元素都必须具有唯一的索引,名称,键,但是您需要考虑一下。 该索引可以由字符串组成,例如一个国家中的城市,而序列中的相应元素表示一些统计值,例如城市人口; 或日期,例如股票序列的交易日。
可以将数据帧视为具有公共索引的多个序列的公共长度,它们在单个表格对象中绑定在一起。 该对象类似于 NumPy 2D ndarray
,但不是同一件事。 并非所有列都必须具有相同的数据类型。 回到城市示例,我们可以有一个包含人口的列,另一个包含该城市所在州或省的信息,还有一个包含布尔值的列,用于标识城市是州还是省的首都,仅使用 NumPy 来完成是一个棘手的壮举。 这些列中的每一个可能都有一个唯一的名称,一个字符串来标识它们包含的信息。 也许可以将其视为变量。 有了这个对象,我们可以轻松,有效地存储,访问和操纵我们的数据。
在下面的笔记本中,我们将预览可以使用序列和数据帧进行的操作:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yGGQOBme-1681367023174)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/1e8c0c05-3a69-4331-8685-aa11ae55feee.png)]
我们将同时加载 NumPy 和 pandas,我们将研究读取 NumPy 和 pandas 的 CSV 文件。 实际上,我们可以在 NumPy 中加载 CSV 文件,并且它们可以具有不同类型的数据,但是为了管理此类文件,您需要创建自定义dtype
以类似于此类数据。 因此,这里有一个 CSV 文件iris.csv
,其中包含鸢尾花数据集。
现在,如果我们希望加载该数据,则需要考虑以下事实:每一行的数据不一定都是同一类型的。 特别是最后一列是针对物种的,它不是数字,而是字符串。 因此,我们需要创建一个自定义dtype
,在此处执行此操作,以调用此新的dtype
模式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FiTJTjZ7-1681367023175)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/d449f161-4900-4564-8b7a-5e2a7bf0edf7.png)]
我们可以使用 NumPy 函数loadtxt
加载此数据集,将dtype
设置为schema
对象,并将定界符设置为逗号以指示它是 CSV 文件。 实际上,我们可以在以下位置读取此数据集:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HSQQO3nT-1681367023175)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/fb5ffbd9-5c83-4152-b50c-09c72d0f5704.png)]
请注意,此数据集必须在您的工作目录中。 如果我们看一下这个数据集,这将是我们注意到的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RjWiThxo-1681367023175)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/b2367c9c-d37f-4737-8685-8f7c8a433fd4.png)]
此输出屏幕截图为,仅表示,实际输出包含更多行。 此数据集的每一行都是此一维 NumPy 数组中的新条目。 实际上,这是一个 NumPy 数组:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6w3g3K3s-1681367023175)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/7662a321-9cfa-465c-872a-90e359ee2026.png)]
我们使用以下命令选择前五行:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6kBHqOn9-1681367023175)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/5262fbb7-d8e0-4e99-b468-91dba378371a.png)]
我们可以选择前五行,并指定我们只希望使用隔片长度,它们是每行的第一元素:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b6yhpac5-1681367023176)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/83e4c85b-b624-4086-9051-d2016421d13d.png)]
我们甚至可以选择花瓣的长度和种类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-11hNJNDG-1681367023176)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/0d275bf1-2f8a-4b4f-841e-5120cf7579c4.png)]
但是有一种更好的方法可以对付 Pandas。 在 Pandas 中,我们将使用read_csv
函数,该函数将自动正确解析 CSV 文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RsOQoQGJ-1681367023176)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/08a48a18-eac9-4788-b8f1-5aae1022d307.png)]
查看此数据集,请注意,使用 Jupyter 笔记本电脑,它的显示方式更加可读。 实际上,这是一个 pandas 数据帧:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-68ydtUg4-1681367023176)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/87068bb2-f619-4e2e-8b37-3ff5c460c85c.png)]
使用head
函数可以看到前五行:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XRwCf3sj-1681367023176)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/47f9f523-1847-4fa6-b05c-b518d001c7df.png)]
通过将其指定为好像是此数据帧的一个属性,我们还可以看到其间隔长度:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ovzKdZoT-1681367023177)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/7da227f0-f566-4636-8681-f891a2bb2b7a.png)]
我们得到的实际上是一个序列。 我们可以选择此数据帧的一个子集,再次返回前五行,然后选择petal_length
和species
列:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VDvsUE26-1681367023177)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/abf8e8f5-aa1b-4c69-907d-cfe54d25b340.png)]
话虽如此,Pandas 的核心是建立在 NumPy 之上。 实际上,我们可以看到 pandas 用于描述其内容的 NumPy 对象:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bYHsyxFh-1681367023177)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c65cf239-06de-4aaf-b417-7a5b18ee2682.png)]
实际上,我们之前创建的 NumPy 对象可用于构造 Pandas 数据帧:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WbevVusz-1681367023177)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/e88f7759-0724-4736-bac7-de4ab7fb85ce.png)]
现在是时候仔细看一下 Pandas 序列和数据帧了。
探索序列和数据帧对象
我们将开始研究 Pandas 序列和数据帧对象。 在本节中,我们将通过研究 Pandas 序列和数据帧的创建方式来开始熟悉它们。 我们将从序列开始,因为它们是数据帧的构建块。 序列是包含单一类型数据的一维数组状对象。 仅凭这一事实,您就可以正确地得出结论,它们与一维 NumPy 数组非常相似,但是与 NumPy 数组相比,序列具有不同的方法,这使它们更适合管理数据。 可以使用索引创建索引,该索引是标识序列内容的元数据。 序列可以处理丢失的数据; 他们通过用 NumPy 的 NaN 表示丢失的数据来做到这一点。
创建序列
我们可以从类似数组的对象创建序列; 其中包括列表,元组和 NumPy ndarray
对象。 我们还可以根据 Python 字典创建序列。 向序列添加索引的另一种方法是通过将唯一哈希值的索引或类似数组的对象传递给序列的创建方法的index
参数来创建索引。
我们也可以单独创建索引。 创建索引与创建序列很像,但是我们要求所有值都必须唯一。 每个序列都有一个索引。 如果我们不分配索引,则将从 0 开始的简单数字序列用作索引。 我们可以通过将字符串传递给该序列的创建方法的name
参数来为该序列命名。 我们这样做是为了,如果我们要使用该序列创建一个数据帧,我们可以自动为该序列分配列名或行名,这样我们就可以知道该序列描述的日期。
换句话说,该名称提供了有用的元数据,我建议在合理范围内尽可能设置此参数。 让我们看一个可行的例子。 请注意,我们直接将序列和数据帧对象导入名称空间:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jd9F6YqZ-1681367023177)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/b2516bf8-dccd-41be-bf29-9dbbe26a3c22.png)]
我们经常这样做,因为这些对象已被详尽地使用。 在这里,我们创建两个序列,一个由数字1
,2
,3
,4
组成,另一个由字母a
,b
和c
组成:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KpM4SQgH-1681367023178)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/ecf99f93-73a1-4895-ac0f-63bda88dbc28.png)]
请注意,索引已自动分配给这两个序列。
让我们创建一个索引; 该索引包含美国城市的名称:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uj4BAfk9-1681367023178)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/24b34554-6143-4b05-85f8-3592e934bea6.png)]
我们将创建一个由pops
组成的新序列,并将该索引分配给我们创建的序列。 这些城市的人口成千上万。 我从维基百科获得了这些数据。 我们还为该序列分配了名称Population
。 结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FgAhqEUp-1681367023178)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/7d137c03-9a76-4029-a9f0-b06f8af92009.png)]
注意,我插入了一个缺失值; 这是Phoenix
的人口,我们确实知道,但是我想添加一些额外的内容来进行演示。 我们也可以使用字典创建序列。 在这种情况下,字典的键将成为结果序列的索引,而值将是结果序列的值。 因此,在这里,我们添加state
名称:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VkbCKLzq-1681367023178)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/0f40bfee-28c6-419a-ac7b-6f5f42b37b51.png)]
我还使用字典创建了一个序列,并在这些城市中填充了相应的区域:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7hoD8uvQ-1681367023179)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/25fd070e-296e-455d-a38c-0325591d2165.png)]
现在,我想提请您注意以下事实:这些序列的长度不相等,而且它们也不都包含相同的键。 它们并非全部或都包含相同的索引。 我们稍后将使用这些序列,因此请记住这一点。
创建数据帧
序列很有趣,主要是因为它们用于构建 pandas 数据帧。 我们可以将 pandas 数据帧视为将序列组合在一起以形成表格对象,其中行和列为序列。 我们可以通过多种方式创建数据帧,我们将在此处进行演示。 我们可以给数据帧一个索引。 我们还可以通过设置columns
参数来手动指定列名。 选择列名遵循与选择索引名相同的规则。
让我们看看一些创建数据帧的方法。 我们要做的第一件事是创建数据帧,我们不会太在意它们的索引。 我们可以从 NumPy 数组创建一个数据帧:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4hXkYUF7-1681367023179)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/299f7640-bffc-4ad5-b4f4-4ae28afa3667.png)]
在这里,我们有一个三维 NumPy 数组,其中填充了数字。 我们可以简单地通过将该对象作为第一个参数传递给数据帧创建函数从该对象创建一个数据帧:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YASTO41Q-1681367023179)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/119801fe-cb4e-4579-9d7c-7b6e88c0b1ee.png)]
如果需要,可以向此DataFrame
添加索引和列名:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KL9phtnI-1681367023179)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/7d5fa02d-ae75-4803-adf4-c00b47e4e973.png)]
我们从元组列表创建数据帧:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EhvvMMtB-1681367023179)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/18107d9f-204a-405e-b397-287510801717.png)]
我们也可以从dict
创建数据帧:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QiwbCS6i-1681367023180)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/aa282d53-2377-44e2-9fa3-e87784e108db.png)]
现在,假设我们要创建一个数据帧并将一个字典传递给它,但是该字典不由长度相同的列表组成。 这将产生一个错误:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ShOyXj3r-1681367023180)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/34b2c99c-803f-4f06-8ec9-9e87c2ae3681.png)]
原因是需要将索引分配给这些值,但是函数不知道如何分配丢失的信息。 它不知道如何对齐这些列表中的数据。
但是,如果我们要传递一个字典(并且字典的值是不等长的序列,但是这些序列具有索引),则不会产生错误:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1FLTl9Zu-1681367023180)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/0bb83419-123b-489f-9b80-dd70ce1e6dd2.png)]
取而代之的是,由于它知道如何排列不同序列中的元素,因此它将这样做,并用 NaN 填充任何缺少信息的位置。
现在,让我们创建一个包含有关序列信息的数据帧,您可能还记得这些序列的长度不同。 此外,它们并非都包含相同的索引值,但是我们仍然能够从它们创建一个数据帧:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B9wuZhmQ-1681367023180)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/1b83c6ff-184f-45ae-a02a-24d0d4e10930.png)]
但是,在这种情况下,这不是我们想要的数据帧。 这是错误的方向; 行是我们将解释为变量的内容,列是我们将解释为键的内容。 因此,我们可以在实际需要的方法中使用字典创建数据帧:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TMjw4VQn-1681367023180)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/bd1d3af6-ccfe-4d06-9da9-c2bb9d06c40c.png)]
或者我们可以像 NumPy 数组一样使用转置方法T
方法来使数据帧处于正确的方向:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4pc481cw-1681367023181)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/96d001d2-c8b3-4668-8aed-7a384d1d5afe.png)]
新增数据
创建序列或数据帧之后,我们可以使用concat
函数或append
方法向其中添加更多数据。 我们将一个对象传递给包含将添加到现有对象中的数据的方法。 如果我们正在使用数据帧,则可以附加新行或新列。 我们可以使用concat
函数添加新列,并使用dict
,序列或数据帧进行连接。
让我们看看如何将新信息添加到序列或数据帧中。 例如,让我们在pops
序列中添加两个新城市,分别是Seattle
和Denver
。 结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kN4MpF03-1681367023181)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/4d9bb80b-ddac-4e0d-9db1-dc6987b9425b.png)]
请注意,这尚未完成。 也就是说,返回了一个新序列,而不是更改现有序列。 我将通过使用所需数据创建一个数据帧来向该数据帧添加新行:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YblZXpco-1681367023181)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/696a8c03-b0af-4b8c-8390-98e16a8a1f34.png)]
我还可以通过有效地创建多个数据帧将新列添加到此数据帧。
我有一个列表,在此列表中,我有两个数据帧。 我有df
,并且我有新的数据帧包含要添加的列。 这不会更改现有的数据帧,而是创建一个全新的数据帧,然后我们需要将其分配给变量:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BPMu0GBl-1681367023181)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/9d8d6515-f3c5-4035-964f-2da367628601.png)]
保存数据帧
假设我们有一个数据帧; 称它为df
。 我们可以轻松保存数据帧的数据。 我们可以使用to_pickle
方法对数据帧进行腌制(将其保存为 Python 常用的格式),并将文件名作为第一个参数传递。
我们可以使用to_csv
保存 CSV 文件,使用to_json
保存 JSON 文件或使用to_html
保存 HTML 表。 还有许多其他格式可用; 例如,我们可以将数据保存在 Excel 电子表格,Stata,DAT 文件,HDF5 格式和 SQL 命令中,以将其插入数据库,甚至复制到剪贴板中。
稍后我们可能会讨论其他方法以及如何加载不同格式的数据。
在此示例中,我将数据帧中的数据保存到 CSV 文件中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4bdTZ0kk-1681367023181)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/5283f0c0-1ce8-487b-a37b-1cf556a6a691.png)]
希望到目前为止,您对什么序列和数据帧更加熟悉。 接下来,我们将讨论在数据帧中设置数据子集,以便您可以快速轻松地获取所需的信息。
选取数据子集
现在我们可以制作 Pandas 序列和数据帧,让我们处理它们包含的数据。 在本节中,我们将看到如何获取和处理我们存储在 Pandas 序列或数据帧中的数据。 自然,这是一个重要的话题。 这些对象否则将毫无用处。
您不应该惊讶于如何对数据帧进行子集化有很多变体。 我们不会在这里涵盖所有特质; 请参考文档进行详尽的讨论。 但是,我们将讨论每个 Pandas 用户应该意识到的最重要的功能。
创建子序列
让我们首先看一下序列。 由于它们与数据帧相似,因此有一些适用的关键过程。 子集序列的最简单方法是用方括号括起来,我们可以这样做,就像我们将列表或 NumPy 数组子集化一样。 冒号运算符确实在这里工作,但我们还有更多工作要做。 我们可以根据序列的索引选择元素,而不是仅根据序列中元素的位置,遵循许多相同的规则,就好像我们使用指示序列中元素位置的整数一样。
冒号运算符也可以正常工作,并且在很大程度上符合预期。 选择两个索引之间的所有元素:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JLZPuwOI-1681367023182)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/89f8aa74-cb85-404d-a300-98786db9f47c.png)]
但是与整数位置不同,冒号运算符确实包含端点。 一个特别有趣的情况是使用布尔值建立索引时。 我将展示这种用法可能看起来像什么。 这样可以方便地获取特定范围内的数据。 如果我们可以得到类似数组的对象(例如列表,NumPy 数组或其他序列)来生成布尔值,则可以将该对象用于索引。 这是一些示例代码,展示了对索引序列的索引:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PGOIx0uJ-1681367023182)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/cacfc4fa-9a1a-44bc-ad71-14ad18d22094.png)]
到目前为止,整数索引以及布尔值索引的行为均符合预期:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UZQXi67i-1681367023182)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/e83b3582-4a47-40ce-a080-00ee3a1a74b4.png)]
唯一真正有趣的示例是当我们将冒号运算符与索引一起使用时; 请注意,所有起点和终点都包括在内,尤其是终点。 这与我们通常与冒号运算符关联的行为不同。 这是一个有趣的示例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XPENDqQB-1681367023182)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c6327805-7b1d-444f-a460-dbb14c237112.png)]
我们有一个序列,并且该序列具有index
的整数,该整数的顺序不为 0 到 4。 现在,顺序混合了。 考虑我们要求的索引。 会发生什么? 一方面,我们可以说最后一个命令将基于索引进行选择。 因此它将选择元素 2 和 4; 他们之间什么都没有。 但另一方面,它可能会使用整数位置来选择序列的第三和第四元素。 换句话说,当我们从 0 开始计数时,它是位置 2 和位置 3,就像您希望将srs2
视为列表一样。 哪种行为会占上风? 还不是很清楚。
索引方法
Pandas 提供的方法可以使我们清楚地说明我们要如何编制索引。 我们还可以区分基于序列索引值的索引和基于对象在序列中的位置的索引,就像处理列表一样。 我们将关注的两种方法是loc
和iloc
。loc
专注于根据序列的索引进行选择,如果我们尝试选择不存在的关键元素,则会出现错误。iloc
就像我们在处理 Python 列表一样建立索引; 也就是说,它基于整数位置进行索引。 因此,如果我们尝试在iloc
中使用非整数进行索引,或者尝试选择有效整数范围之外的元素,则会产生错误。 有一种hybrid
方法ix
,其作用类似于loc
,但是如果传递的输入无法针对索引进行解释,则它的作用将类似于iloc
。 由于ix
的行为模棱两可,因此我建议大多数时候坚持使用loc
或iloc
。
让我们回到我们的例子。 事实证明,在这种情况下,方括号的索引类似于iloc
; 也就是说,它们基于整数位置进行索引,就好像srs2
是一个列表一样。 如果我们想基于srs2
的索引进行索引,则可以使用loc
进行索引,以获得其他可能的结果。 再次注意,在这种情况下,两个端点都包括在内。 这与我们通常与冒号运算符关联的行为不同:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Egh7lRYc-1681367023183)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/fbd66516-62ee-411e-a047-fc38a67c14c5.png)]
切片数据帧
在讨论切片序列之后,让我们谈谈切片数据帧。 好消息是,在谈论序列切片时,许多艰苦的工作已经完成。 我们介绍了loc
和iloc
作为连接方法,但它们也是数据帧方法。 毕竟,您应该考虑将数据帧视为多个列粘合在一起的序列。
现在,我们需要考虑从序列中学到的知识如何转换为二维设置。 如果我们使用括号表示法,它将仅适用于数据帧的列。 我们将需要使用loc
和iloc
来对数据帧的行进行子集化。 实际上,这些方法可以接受两个位置参数。 根据我们前面描述的规则,第一个位置参数确定要选择的行,第二个位置参数确定要选择的列。 可以发出第二个参数来选择所有列,并将选择规则仅应用于行。 这意味着我们应该将第一个参数作为冒号,以便在我们选择的列中更加挑剔。
loc
和iloc
将在它们的两个参数上加上基于索引的索引或基于整数位置的索引,而ix
可能允许混合使用此行为。 我不建议这样做。 对于后来的读者来说,结果太含糊了。 如果要混合loc
和iloc
的行为,建议使用方法链接。 也就是说,如果要基于索引选择行,而要基于整数位置选择列,请首先使用loc
方法选择行,然后使用iloc
方法选择列。 执行此操作时,如何选择数据帧的元素没有任何歧义。
如果您只想选择一列怎么办? 结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n9cxiHqn-1681367023183)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/7a04ad57-6627-41aa-b93d-89bc0d95ef54.png)]
这样做很简捷; 只需将特定的列视为数据帧的属性,作为对象,使用点表示法有效地选择它即可。 这可以很方便:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5dAkBFbd-1681367023183)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/f049093d-84e8-473b-b2d4-765c08aa2744.png)]
请记住,Pandas 是从 NumPy 构建的,在数据帧的后面是 NumPy 数组。
因此,知道了您现在对 NumPy 数组所了解的知识后,以下事实对您来说就不足为奇了。 将数据帧的切片操作的结果分配给变量时,变量承载的不是数据的副本,而是原始数据帧中数据的视图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pyC9YIMI-1681367023183)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/279074fb-d4e4-44a0-8124-01b6a2813a02.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gddfe7E4-1681367023184)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/1884861d-d8ae-4d16-ac15-c87f0b32b6c4.png)]
如果要制作此数据的独立副本,则需要使用数据帧的copy
方法。 序列也是如此。
现在来看一个例子。 我们创建一个数据帧df
,它具有有趣的索引和列名:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6sSDOIq8-1681367023184)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/1735a032-d079-4cfb-a7f1-af13d15f6d01.png)]
通过将第一列的名称视为df
的属性,我可以轻松地获得一个表示第一列中数据的序列。 接下来,我们看到loc
和iloc
的行为。loc
根据它们的索引选择行和列,但是iloc
像选择列表一样选择它们。 也就是说,它使用整数位置:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eyXVTXBe-1681367023184)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/57648920-799d-4aa6-a581-faca79154bff.png)]
在这里,我们看到了方法链接。 对于输入 10,您可能会注意到它的开始类似于上一张幻灯片中的输入 9,但随后我在结果视图上调用了loc
,以进一步细分数据。 我将此方法链接的结果保存在df2
中。 我还用df2
更改了第二列的内容,并用新的自定义数据的序列替换了它们:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XqcrZoYM-1681367023184)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/b2e51dc4-3b34-4a0e-b65a-714e5be57710.png)]
由于df2
是df
的独立副本,因此请注意,在创建df2
时必须使用复制方法; 原始数据不受影响。 这使我们到达了重要的地步。序列和数据帧不是不可变的对象。 您可以更改其内容。 这类似于更改 NumPy 数组中的内容。 但是,在跨列进行更改时要小心; 它们可能不是同一数据类型,从而导致不可预测的结果。有时 :
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BVJ7b0Ot-1681367023185)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/683559b6-4034-4715-86ab-2024b20970c5.png)]
我们在这里看到什么分配:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nBm9P1p2-1681367023185)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/27c5c14f-fdfb-49e4-9bd2-843ad03d966e.png)]
这种行为与您在 NumPy 中看到的行为非常相似,因此我将不做过多讨论。 关于子集,还有很多要说的,特别是当索引实际上是MultiIndex
时,但这是以后使用的。
总结
在本章中,我们介绍了 Pandas 并研究了它的作用。 我们探索了 Pandas 序列数据帧并创建了它们。 我们还研究了如何将数据添加到序列和数据帧中。 最后,我们介绍了保存数据帧。 在下一章中,我们将讨论算术,函数应用和函数映射。
五、Pandas 的算术,函数应用以及映射
我们已经看到了使用 pandas 序列和数据帧完成的一些基本任务。 让我们继续进行更有趣的应用。 在本章中,我们将重新讨论先前讨论的一些主题,这些主题涉及将算术函数应用于多元对象并处理 Pandas 中的缺失数据。
算术
让我们来看一个例子。 我们要做的第一件事是启动 pandas 和 NumPy。
在以下屏幕截图中,我们有两个序列,srs1
和srs2
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6uRMyliw-1681367023185)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/1aeacb3c-603c-4ed2-9c3c-fa28e1475e16.png)]
srs1
的索引从 0 到 4,而srs2
的索引从 0 到 3,先跳过 4,然后再到 5。从技术上讲,这两个序列的长度是相同的,但是并不意味着这些元素将按照您的预期进行匹配。 例如,让我们考虑以下代码。 当我们添加srs1
和srs2
时会发生什么?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SM2chq3I-1681367023185)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/df0aba8d-49b9-405b-9348-dd6e2c3bbc92.png)]
产生了两个 NaN。 这是因为,对于元素 0 到 3,两个序列中都有可以匹配的元素,但是对于 4 和 5,两个序列中每个索引都有不等价的元素。 当我们相乘时也是如此,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xyAn8cMQ-1681367023186)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/448fed81-c330-4aee-8cf2-f2d721d9a7bb.png)]
或者,如果我们要求幂,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0sdzD7Y8-1681367023186)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/867566da-a87d-4d0d-8fde-48ede04cac77.png)]
话虽这么说,布尔运算是不同的。 在这种情况下,就像您通常期望的那样,逐个元素进行比较。 实际上,布尔比较似乎根本不关心索引,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-souYALNf-1681367023186)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/8e3523d4-b5c9-482e-afb8-fe0a5d9c81fb.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iASXS1u1-1681367023186)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/a5935cbe-4cb7-4b1b-b0eb-dc4eb10bd1d7.png)]
取srs2
的平方根,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OAe7n6G8-1681367023186)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/145eb41c-4d14-4148-9eaa-af0613bae742.png)]
注意,该序列的索引已保留,但我们采用了该序列元素的平方根。 让我们以srs1
的绝对值-再次为预期结果-并注意,我们可以确认这实际上仍然是一个序列,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uPMBkewS-1681367023187)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/f597919b-359d-4d02-a098-442b90b23121.png)]
现在,让我们应用自定义ufunc
。 在这里,我们使用装饰器符号。 在下一个屏幕截图中,让我们看看使用此截断函数的向量化版本,数组然后将其应用于srs1
时会发生什么,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eFRelQPm-1681367023187)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/f5d73fed-b5c3-49b0-8a7e-4c0f187c8be6.png)]
注意srs1
(以前是 Pandas 序列)已不再是序列; 现在是 NumPy ndarray
。 因此,该序列的索引丢失了。
计算srs1
的平均值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G3Vw7idM-1681367023187)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/35d183da-9f09-4827-819a-c0d63c267e43.png)]
或标准偏差,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-itWSOfii-1681367023187)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/b307a410-27be-41db-bad9-9e3aad4331e4.png)]
最大元素,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VxGqPO5I-1681367023188)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/817ba0ef-aabf-4e7e-b644-ea18c778b5a5.png)]
或最大元素所在的位置,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YdQWP3zq-1681367023188)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/7a6b49ea-ccf9-4257-8ce2-7f6fc1d706a9.png)]
或累加和,连续创建序列的元素:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vcroukE1-1681367023188)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/52644228-88c6-44db-b6ce-d6b69b599d7d.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5mY5ajWP-1681367023188)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/3fa02489-e851-43ae-8a6c-3f9d4440aca9.png)]
现在,让我们谈谈函数应用和映射。 这类似于我们之前定义的截断函数。 我正在使用lambda
表达式创建一个临时函数,然后将该临时函数应用于srs1
的每个元素,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tON6TJTa-1681367023188)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/4ab5fcba-1a5b-4fc6-92fb-f0c3d827aa87.png)]
我们可以定义一个向量化函数来执行此操作,但是请注意,通过使用apply
,我们设法保留了序列结构。 让我们创建一个新序列srs3
,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s2c3Gx1I-1681367023189)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/6448ba68-fdf2-4c13-9aa9-74dd95d66292.png)]
让我们看看当我们有了字典并将srs3
映射到字典时会发生什么。 请注意,srs3
的元素对应于字典的键。 因此,当我们映射时,我最终得到的是另一个序列,并且对应于由序列映射查找的键的字典对象的值如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WJ1bpCb1-1681367023189)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/8b1383d6-61e6-469b-b2ba-9120749a47b9.png)]
这也适用于函数,例如应用方式。
数据帧的算术
数据帧之间的算术与序列或 NumPy 数组算术具有某些相似之处。 如您所料,两个数据帧或一个数据帧与一个缩放器之间的算术工作; 但是数据帧和序列之间的算术运算需要谨慎。 必须牢记的是,涉及数据帧的算法首先应用于数据帧的列,然后再应用于数据帧的行。 因此,数据帧中的列将与单个标量,具有与该列同名的索引的序列元素或其他涉及的数据帧中的列匹配。 如果有序列或数据帧的元素找不到匹配项,则会生成新列,对应于不匹配的元素或列,并填充 Nan。
数据帧和向量化
向量化可以应用于数据帧。 给定一个数据帧时,许多 NumPy ufuncs
(例如平方根或sqrt
)将按预期工作; 实际上,当给定数据帧时,它们仍可能返回数据帧。 也就是说,这不能保证,尤其是在使用通过vectorize
创建的自定义ufunc
时。 在这种情况下,他们可能会返回ndarray
。 虽然这些方法适用于具有通用数据类型的数据帧,但是不能保证它们将适用于所有数据帧。
数据帧的函数应用
毫不奇怪,数据帧提供了函数应用的方法。 您应注意两种方法:apply
和applymap
。apply
带有一个函数,默认情况下,将该函数应用于与数据帧的每一列相对应的序列。 产生的内容取决于函数的功能。 我们可以更改apply
的axis
参数,以便将其应用于行(即跨列),而不是应用于列(即跨行)。applymap
具有与应用不同的目的。 鉴于apply
将在每一列上求值提供的函数,因此应准备接收序列,而applymap
将分别在数据帧的每个元素上求值pass
函数。
我们可以使用apply
函数来获取所需的数量,但是使用数据帧提供的现有方法通常更有用,并且也许更快。
让我们看一些使用数据帧的演示。 与该序列一起使用的许多技巧也可以与数据帧一起使用,但有些复杂。 因此,让我们首先创建一个数据帧,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PamRg4wC-1681367023189)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/e8841530-cc52-4365-84bb-3556f47f7939.png)]
这里我们从另一个数据帧中减去一个数据帧:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8h0LIYmt-1681367023189)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/db6f0435-908f-48a7-900d-c9f8f6f31668.png)]
还有一些使用数据帧的有用方法。 例如,我们可以取每列的平均值,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3h1aCa4m-1681367023190)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/57047275-afc2-4675-9003-3b060c5e36c1.png)]
或者我们可以找到每列的标准偏差,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O75ZRF5O-1681367023190)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/b5e9c90a-680c-4125-a367-6c8439b80f64.png)]
另一个有用的技巧是标准化每列中的数字。 现在,df.mean
和df.std
返回一个序列,所以我们实际上要做的是减去一个序列,然后除以一个序列,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bNGgGNRc-1681367023190)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/441b9928-2a05-4868-bef2-ceda07302961.png)]
现在让我们看一下向量化。 平方根函数是 NumPy 的向量化函数,可在数据帧上按预期工作:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SpLb5CMu-1681367023190)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/abd19d26-34d7-4089-813c-fc8eaf08dae6.png)]
还记得自定义ufunc
trunk
吗? 它不会给我们一个数据帧,但是它将求值并返回类似于数据帧的内容,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dDrKzOHr-1681367023190)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c76fa618-cc00-44e4-8fd6-1fb7808165e3.png)]
但是,在混合数据类型的数据帧上运行时,这将产生错误:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JPG8ajA3-1681367023191)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/24b88976-04a0-4203-ad18-8c4840e60822.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YhhilxeM-1681367023191)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/6ecdcc63-b265-4f5a-ac83-1894df73affd.png)]
这就是为什么您需要小心的原因。 现在,在这里,我将向您展示避免混合数据类型问题的技巧。 注意,我使用的是我以前未介绍过的方法select_dtypes
。 这将是选择具有特定dtype
的列。 在这种情况下,我需要数字dtype
的列:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O7WIPd4p-1681367023191)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/1ce252a9-f718-458c-a3c7-cad5666aca4a.png)]
请注意,排除了由字符串数据组成的第三列。 因此,当我取平方根时,除了负数外,它都可以正常工作:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PjNEbmBe-1681367023191)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/28fbf5d6-c9e9-40e1-b003-9fc26681f2ce.png)]
现在,让我们看一下函数的应用。 在这里,我将定义一个函数,该函数计算所谓的[HTG1]几何平均值。 因此,我要做的第一件事是定义一个几何mean
函数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2tcWDNm1-1681367023191)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/6a665d98-3b5c-479b-a752-3b2f7c87e09c.png)]
我们将此函数应用于数据帧的每一列:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S7Y2eDMN-1681367023192)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/4d3ab7da-ec1c-4aae-bb9f-6907c8f1759c.png)]
我展示的最后一个技巧是applymap
,在该示例中,我演示了此函数如何与用于截断函数的新 lambda 一起工作,这次是在3
处截断:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wgITwUSr-1681367023192)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/13e089b1-bc2f-4fa7-8503-c0d1492ae320.png)]
接下来,我们将讨论解决数据帧中丢失数据的方法。
处理 Pandas 数据帧中的丢失数据
在本节中,我们将研究如何处理 Pandas 数据帧中的丢失数据。 我们有几种方法可以检测对序列和数据帧都有效的缺失数据。 我们可以使用 NumPy 的isnan
函数; 我们还可以使用序列和数据帧提供的isnull
或notnull
方法进行检测。 NaN 检测对于处理丢失信息的自定义方法可能很有用。
在本笔记本中,我们将研究管理丢失信息的方法。 首先,我们生成一个包含缺失数据的数据帧,如以下屏幕截图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qwfT6liN-1681367023192)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/71e4866d-1e34-4072-9f30-66daeba42910.png)]
如之前在 Pandas 中提到的,缺失的信息由 NumPy 的 NaN 编码。 显然,这不一定是到处编码丢失的信息的方式。 例如,在某些调查中,丢失的数据由不可能的数值编码。 假设母亲的孩子人数为 999; 这显然是不正确的。 这是使用标记值指示缺少信息的示例。
但是在这里,我们仅使用使用 NaN 表示缺失数据的 Pandas 约定。 我们还可以创建一个缺少数据的序列。 下一个屏幕截图显示了该序列:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xqUtMmyN-1681367023192)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/41acc8cd-2f05-4868-82ef-7f69e42a6562.png)]
让我们看一些检测丢失数据的方法。 这些方法将产生相同的结果或完全矛盾的结果。 例如,我们可以使用 NumPy 的isnan
函数返回一个数据帧,如果数据为 NaN 或丢失,则返回true
,否则返回false
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5jOySMGq-1681367023192)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/637b576a-8f40-4a7f-86e1-17f3e4bd65a5.png)]
isnull
方法做类似的事情; 只是它使用了数据帧方法而不是 NumPy 函数,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vzQ7RPIk-1681367023193)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/6f31c997-41ea-4863-bbea-39fc8e9fb8a3.png)]
notnull
函数基本上与isnull
函数完全相反; 缺少数据时返回false
,不丢失数据时返回true
,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y24JoLCt-1681367023193)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/2696fb61-724d-4539-a2ff-062ff73ea35f.png)]
删除缺失的信息
序列和数据帧的dropna
可用于创建对象的副本,其中删除了丢失的信息行。 默认情况下,它将删除缺少任何数据的行,并且与序列一起使用时,它将使用 NaN 消除元素。 如果要适当完成此操作,请将inplace
参数设置为true
。
如果我们只想删除仅包含缺少信息的行,因此不删除任何使用信息,则可以将how
参数设置为全部。 默认情况下,此方法适用于行,但如果要更改其适用于列,则可以将access
参数设置为 1。
这是我们刚才讨论的示例。 让我们使用此数据帧df
,并删除存在缺失数据的所有行:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4zysMMDZ-1681367023193)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/197cde54-08db-4810-a7fc-409118152df4.png)]
注意,我们大大缩小了数据帧的大小; 只有两行仅包含完整信息。 我们可以对该序列做类似的事情,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IYulqa4T-1681367023193)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c7c3c7cf-7299-478e-8790-72fb39547812.png)]
有时,在计算某些指标时会忽略掉丢失的信息。 例如,在计算特定指标(例如均值,总和,标准差等)时,简单地排除丢失的信息根本没有问题。 尽管可以更改参数来控制此行为(可能由skipna
之类的参数指定),但是默认情况下,这是由许多 pandas 方法完成的。 当我们尝试填充丢失的数据时,此方法可能是一个很好的中间步骤。 例如,我们可以尝试用非缺失数据的平均值填充一列中的缺失数据。
填充缺失的信息
我们可以使用fillna
方法来替换序列或数据帧中丢失的信息。 我们给fillna
一个对象,该对象指示该方法应如何替换此信息。 默认情况下,该方法创建一个新的数据帧或序列。 我们可以给fillna
一个值,一个dict
,一个序列或一个数据帧。 如果给定单个值,那么所有指示缺少信息的条目将被该值替换。dict
可用于更高级的替换方案。dict
的值可以对应于数据帧的列;例如, 可以将其视为告诉如何填充每一列中的缺失信息。 如果使用序列来填充序列中的缺失信息,那么过去的序列将告诉您如何用缺失的数据填充序列中的特定条目。 类似地,当使用数据帧填充数据帧中的丢失信息时,也是如此。
如果使用序列来填充数据帧中的缺失信息,则序列索引应对应于数据帧的列,并且它提供用于填充该数据帧中特定列的值。
让我们看一些填补缺失信息的方法。 例如,我们可以尝试通过计算其余数据集的均值来填充缺失的信息,然后用均值填充该数据集中的缺失数据。 在下一个屏幕截图中,我们可以看到用零填充缺失的信息,这是一种非常粗糙的方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-20G80am9-1681367023193)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/26a9b0fd-8645-4b49-beff-880483d95509.png)]
更好的方法是用均值填充丢失的数据,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gwgjdBqA-1681367023194)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/b33b50a1-978b-43c7-8e95-cd4c1adbb7b0.png)]
但是请注意,有些事情可能并不相同。 例如,尽管新数据集的均值与丢失的信息的均值与原始数据集的均值相同,但将原始数据集的标准差与新数据集的标准差进行比较,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jLJ7Nwsd-1681367023194)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/156eb4f0-ac74-4705-8e3b-141e5f21ad48.png)]
标准偏差下降; 这方面没有保留。 因此,我们可能要使用其他方法来填写丢失的信息。 也许,尝试这种方法的方法是通过随机生成均值和标准差与原始数据相同的数据。 在这里,我们看到了一种类似于自举统计技术的技术,在该技术中,您从现有数据集中重新采样以在模拟数据集中模拟其属性。 我们首先生成一个全新的数据集,一个从原始序列中随机选择数字的序列,并作为缺失数据的索引,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tfc9OdPt-1681367023194)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/91abdaf5-a983-436d-868f-c5daf34c6387.png)]
然后,该序列用于填写原始序列的缺失数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EADGNfqA-1681367023194)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/faeafaf8-4b95-4352-8c2d-b332f87c1b7d.png)]
条目 5 和 7 对应于用于填写缺失数据的序列。 现在让我们计算均值,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OclFy599-1681367023195)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/027ca51a-884d-4dbd-a2b6-da8948177773.png)]
均值和标准差都不相同,但是至少与标准差相比,这些均值与原始均值和标准差之间的差异并不像以前那么严重。 现在,很明显有了随机数,只有大样本量才能保证。
让我们看一下在数据帧中填充缺少的信息。 例如,这是以前使用的数据帧,在这里我们用 0 填写丢失的数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G6Tzxj3i-1681367023195)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/b0dea539-9856-45c9-9bc8-ce4e0639d741.png)]
现在,您当然会认为数字 0 有问题,所以让我们看一下也许用列均值填充丢失的数据。 这样做的命令可能类似于以下内容:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tfv6Qsuw-1681367023195)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/56068f38-ce8f-49a7-8a36-5bf7c17debb7.png)]
但是要注意一些事情; 当我们使用这种方法来填写缺失的数据时,标准偏差都比以前降低了!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jrANkTZ7-1681367023195)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/46a1feee-8b13-4107-8818-cc7aebe8d755.png)]
我们将尝试之前尝试过的引导技巧。 我们将使用字典或dict
填充缺少的信息。 我们将创建一个dict
,其中每个列均包含一个序列,而该序列在数据帧中缺少信息,这些序列将类似于我们先前生成的序列:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qy6i7C1W-1681367023195)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c0f583f9-cdfd-4384-b0bb-8ed5b2321b68.png)]
然后,使用此字典中包含的数据填充缺少的信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-62ovXy4V-1681367023196)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/d6fdf0c4-422a-45b1-9930-ab0a0784a7e5.png)]
注意均值和标准偏差之间的关系:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2LMAOuy6-1681367023196)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c90d4236-1ea9-4d4d-b221-4ad6e8ec27f9.png)]
总结
在本章中,我们介绍了 Pandas 数据帧,向量化和数据帧函数应用的算术运算。 我们还学习了如何通过删除或填写缺失的信息来处理 pandas 数据帧中的缺失数据。 在下一章中,我们将研究数据分析项目中的常见任务,排序和绘图。
六、排序,索引和绘图
现在让我们简要介绍一下使用 pandas 方法对数据进行排序。 在本章中,我们将研究排序和排名。 排序是将数据按各种顺序排列,而排名则是查找数据如果经过排序将位于哪个顺序中。 我们将看看如何在 Pandas 中实现这一目标。 我们还将介绍 Pandas 的分层索引和绘图。
按索引排序
在谈论排序时,我们需要考虑我们到底要排序什么。 有行,列,它们的索引以及它们包含的数据。 让我们首先看一下索引排序。 我们可以使用sort_index
方法重新排列数据帧的行,以使行索引按顺序排列。 我们还可以通过将sort_index
的访问参数设置为1
来对列进行排序。 默认情况下,排序是按升序进行的; 后几行的值比前几行大,但是我们可以通过将sort_index
值的升值设置为false
来更改此行为。 这按降序排序。 默认情况下,此操作未就位。 为此,您需要将sort_index
的就地参数设置为true
。
虽然我强调了对数据帧进行排序,但是对序列进行排序实际上是相同的。 让我们来看一个例子。 加载 NumPy 和 pandas 之后,我们创建一个数据帧并带有要排序的值,如以下屏幕快照所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hosEyx7q-1681367023196)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/33d3bbe7-bd54-4ad3-a776-44859ef39984.png)]
让我们对索引进行排序; 请注意,这没有就位:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-slJ3zbkD-1681367023197)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/37c19d95-295f-4662-9b9e-a5aafc6120f5.png)]
这次我们将列排序 ,我们将通过设置ascending=False
来反向排列它们; 因此第一列现在是CCC
,最后一列是AAA
,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dOf3hC7o-1681367023197)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/02543552-9690-4d59-a8f0-62940f0f83c7.png)]
按值排序
如果我们希望对数据帧的行或元素序列进行排序,则需要使用sort_values
方法。 对于序列,您可以致电sort_values
并每天致电。 但是,对于数据帧,您需要设置by
参数; 您可以将by
设置为一个字符串,以指示要作为排序依据的列,或者设置为字符串列表,以指示列名称。 根据该列表的第一列,将首先进行的排序; 然后,当出现领带时,将根据下一列进行排序,依此类推。
因此,让我们演示其中一些排序技术。 我们根据AAA
列对数据帧的值进行排序,如以下屏幕截图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IViOKZHm-1681367023197)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/4c278caa-05d2-4442-9047-9d4936e5b7e5.png)]
请注意,AAA
中的所有条目现在都是按顺序排列的,尽管其他列的内容不多。 但是我们可以使用以下命令根据BBB
排序并根据CCC
打破平局。 结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j5WzUUYE-1681367023198)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/4457a7af-f3ae-44d5-9d2e-7b4113ea14b1.png)]
排名告诉我们如果元素按顺序排列将如何显示。 我们可以使用rank
方法来查找序列或数据帧中元素的排名。 默认情况下,排名是按升序进行的; 将升序参数设置为false
可更改此设置。 除非发生联系,否则排名很简单。 在这种情况下,您将需要一种确定排名的方法。 有四种处理联系的方法:平均值,最小值,最大值和第一种。 平均值给出平均等级,最小值赋予尽可能低的等级,最大值赋予尽可能最高的等级,然后首先使用序列中的顺序打破平局,以使它们永远不会发生。 当在数据帧上调用时,每一列都将单独排名,结果将是一个包含等级的数据帧。 现在,让我们看看这个排名。 我们要求df
中条目的排名,这实际上是结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-crL4YaVp-1681367023198)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/1468e55d-f480-4e84-94d6-f9459e425cf1.png)]
注意,我们看到了此数据帧每个条目的排名。 现在,请注意这里有一些联系,特别是对于列CCC
的条目e
和条目g
。 我们使用平均值来打破平局,这是默认设置,但是如果我们愿意,可以将其设置为max
,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-04YeTHcM-1681367023198)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/414d3e3a-a998-403b-8c50-58aabf720bda.png)]
结果,这两个都排在第五位。 接下来,我们讨论分层索引。
分层索引
我们已经走了很长一段路,但是还没有完成。 我们需要谈论分层索引。 在本节中,我们研究层次索引,为何有用,如何创建索引以及如何使用它们。
那么,什么是层次结构索引? 它们为索引带来了额外的结构,并以MultiIndex
类对象的形式存在于 Pandas 中,但它们仍然是可以分配给序列或数据帧的索引。 对于分层索引,我们认为数据帧中的行或序列中的元素由两个或多个索引的组合唯一标识。 这些索引具有层次结构,选择一个级别的索引将选择具有该级别索引的所有元素。 我们可以走更理论的道路,并声称当我们有MultiIndex
时,表格的尺寸会增加。 它的行为不是作为存在数据的正方形,而是作为多维数据集,或者至少是可能的。
当我们想要索引上的其他结构而不将该结构视为新列时,将使用分层索引。 创建MultiIndex
的一种方法是在 Pandas 中使用MultiIndex
对象的初始化方法。 我们也可以在创建 Pandas 序列或数据帧时隐式创建MultiIndex
,方法是将列表列表传递给index
参数,每个列表的长度与该序列的长度相同。 两种方法都是可以接受的,但是在第一种情况下,我们将有一个index
对象分配给序列或要创建的数据帧。 第二个是同时创建序列和MultiIndex
。
让我们创建一些层次结构索引。 导入 Pandas 和 NumPy 之后,我们直接使用MultiIndex
对象创建MultiIndex
。 现在,这种表示法可能有点难以理解,因此让我们创建该索引并解释刚刚发生的情况:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WfzcTqG2-1681367023199)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/70dbf80f-d9e4-4b0c-9b4e-f1781334acc2.png)]
在这里,我们指定索引的级别,即MultiIndex
可以取的可能值。 因此,对于第一级,我们有a
和b
; 对于第二级,alpha
和beta
; 对于第三级,1
和2
。 然后,我们为MultiIndex
的每一行分配采用这些级别中的哪个级别。 因此,此第一列表的每个零指示值a
,此列表的每个零指示值b
。 然后第二个列表中的alpha
为零,beta
为。 在第三列表中,为零,2
为零。 因此,在将midx
分配给序列索引后,最终得到该对象。
创建MultiIndex
的另一种方法是直接在创建我们感兴趣的序列时使用。这里,index
参数已传递了多个列表,每个列表都是MulitIndex
的一部分。
第一行用于MulitIndex
的第一级,第二行用于第二级,第三行用于第三级。 这与我们在较早的情况下所做的非常相似,但是没有明确定义级别,然后定义该序列的每个值中的哪个级别,我们只需要输入我们感兴趣的值即可:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ck5i4caV-1681367023199)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/dadcad3c-8f00-45d4-ba0d-91916abb6ea0.png)]
注意,这些产生相同的结果。
切片带有分层索引的序列
在切片时,序列的层次索引类似于 NumPy 多维数组。 例如,如果使用方括号访问器,我们只需用逗号分隔层次结构索引的级别,然后对每个级别进行切片,就可以想象它们是某些高维对象各个维度的单独索引。 这适用于loc
方法和序列,但不适用于数据帧; 我们待会儿再看。 使用loc
时,切片索引时所有常用的技巧仍然有效,但是切片操作获得多个结果会更容易。
因此,让我们看一下实际操作中的MultiIndex
序列。 我们要做的第一件事是切片第一层,仅选择第一层为b
的那些元素; 结果是:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v5aA3kqf-1681367023199)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/a2f577d5-3e7b-4b0c-a69f-a920b7b281d5.png)]
然后我们将其进一步缩小到b
和alpha
; 结果如下。 这将是该序列的alpha
片段(在前面的屏幕截图中):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RAjCOWk2-1681367023199)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/94bc6803-df54-4698-b805-d69926fa1629.png)]
然后我们进一步选择它,因此如果要选择本序列的一个特定元素,我们必须走三个层次,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qF1LSb7L-1681367023200)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/19405c15-5873-4d9d-ae42-c0b3a4c12b89.png)]
如果我们希望选择序列中的每个元素,例如第一个级别为a
,最后一个级别为1
,则需要在中间放置一个冒号,以表示我们不在乎是否有alpha
或beta
,结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SC6mUUYP-1681367023200)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/30953bfe-5eeb-44d6-99d3-989faddb675d.png)]
当为数据帧提供层次结构索引时,我们仍然可以使用loc
方法进行索引,但是这样做比序列更为棘手。 毕竟,我们不能用逗号分隔索引的级别,因为我们有第二维,即列。 因此,我们使用元组为切片数据帧的维度提供了说明,并提供了指示如何进行切片的对象。 元组的每个元素可以是数字,字符串或所需元素的列表。
使用元组时,我们不能真正使用冒号表示法。 我们将需要依靠切片器。 我们在这里看到如何复制切片器常用的一些切片符号。 我们可以将这些切片器传递给用于切片的元组的元素,以便我们可以执行所需的切片操作。 如果要选择所有列,我们仍然需要在loc
中列的位置提供一个冒号。 自然,我们可以用更具体的切片方法(例如列表或单个元素)替换切片器。 现在,我从未谈论过如果列具有层次结构索引会发生什么情况。 这是因为过程本质上是相同的-因为列只是不同轴上的索引。
因此,现在让我们看一下管理附加到数据帧的层次结构索引。 我们要做的第一件事是创建带有分层索引的数据帧。 然后,我们选择该索引的第一级为b
的所有行。 我们得到以下结果,这并不太令人震惊:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LUoFwH1h-1681367023200)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/4b156f08-6720-43af-a387-e617b557935d.png)]
然后我们通过缩小b
和alpha
进行重复,但是请注意,我们现在必须使用元组以确保alpha
不会被解释为我们感兴趣的列,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pdM4RKN7-1681367023200)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/f74b545c-a6ea-4a41-9c60-bc62f6398d08.png)]
然后,我们进一步缩小范围,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mVN2otPJ-1681367023200)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/9828715b-96c1-42d7-bf4b-356f1f0ed2e0.png)]
现在,让我们尝试复制以前做过的一些事情,但是请记住,我们在这里不能再使用冒号了。 我们必须使用切片器。 因此,我们将在此处使用的切片调用与srs.loc['b', 'alpha', 1]
中使用的切片调用相同。 我说slice(None)
,这基本上意味着选择第二级中的所有内容:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wWxSuhc7-1681367023201)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/ae2b35bb-a049-49cf-814e-c77641a998fd.png)]
如果要选择所有列,则必须在列的位置放一个冒号。 否则将引发错误。 在这里,我们将执行等效于使用:'b'
的操作,因此我们从一开始就选择b
。 结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nljNOo2l-1681367023201)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/db82b410-e537-4c22-af0d-0715f05bc5d3.png)]
最后,我们选择第一级中的所有内容,然后选择第二级中的所有内容,但是我们仅在第三级中选择,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0fifpmsF-1681367023201)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/150ccf4a-ec53-4af4-91a3-f0958de9c33b.png)]
并注意,我们也一直在将索引调用传递给列,因为这是一个完全独立的调用。 现在,我们继续使用 Pandas 提供的绘图方法。
用 Pandas 绘图
在本节中,我们将讨论 pandas 序列和数据帧提供的绘图方法。 您将看到如何轻松快速地创建许多有用的图。 Pandas 尚未提出完全属于自己的绘图功能。 相反,使用 pandas 方法从 pandas 对象创建的图只是对称为 Matplotlib 的绘图库进行更复杂调用的包装。 这是科学 Python 社区中众所周知的库,它是最早的绘图系统之一,也许是最常用的绘图系统,尽管其他绘图系统正在寻求替代它。
它最初是由 MATLAB 随附的绘图系统启发的,尽管现在它是它自己的野兽,但不一定是最容易使用的。 Matplotlib 具有许多功能,在本课程中,我们将只涉及其绘制的表面。 在本节中,我们将讨论在特定实例之外使用 Python 进行可视化的程度,即使可视化是从初始探索到呈现结果的数据分析的关键部分。 我建议寻找其他资源以了解有关可视化的更多信息。 例如,Packt 有专门针对该主题的视频课程。
无论如何,如果我们希望能够使用 pandas 方法进行绘图,则必须安装 Matplotlib 并可以使用。 如果您正在使用 Jupyter 笔记本或 Jupyter QtConsole 或其他基于 IPython 的环境,则建议运行pylab
魔术。
绘图方法
关键的 pandas 对象,序列和数据帧提供了一种绘图方法,简称为plot
。 它可以轻松地创建图表,例如折线图,散点图,条形图或所谓的核密度估计图(用于了解数据的形状) , 等等。 可以创建许多图。 我们可以通过将plot
中的kind
参数设置为字符串来控制所需的绘图,以指示所需的绘图。 通常,这会产生一些带有通常选择的默认参数的图。 通过在plot
方法中指定其他参数,我们可以更好地控制最终输出,然后将这些参数传递给 Matplotlib。 因此,我们可以控制诸如标签,绘图样式,x 限制,y 限制,不透明度和其他详细信息之类的问题。
存在用于创建不同图的其他方法。 例如,序列有一个称为hist
的方法来创建直方图。
在本笔记本中,我将演示一些图形。 我要做的第一件事是在pandas
中加载,并且我将使用pylab
魔术(带有参数inline
的 Matplotlib 魔术),以便我们可以在创建它们的那一刻看到绘图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-35mdN92M-1681367023202)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c472ddcb-ba3b-40b5-8bba-a9997d2ab6ed.png)]
现在,我们创建一个包含三个随机游走的数据帧,这是概率论中研究和使用的一个过程。 可以通过创建标准的正常随机变量,然后对其进行累加总和来生成随机游动,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hZzQmrRv-1681367023202)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/d7ae015a-e31b-4ed2-84de-43c2c61c3af8.png)]
我们使用head
方法仅查看前五行。 这是了解数据集结构的好方法。 那么,这些地块是什么样的? 好吧,让我们创建一个可视化它们的折线图,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-07ZwGvSA-1681367023202)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/77895404-17e4-46e0-ad77-5aeb36b9051e.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uRiCGqE9-1681367023202)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c4314631-cb23-4d2c-bf5a-18c81da12168.png)]
这些只是上下随机运动。 请注意,plot
方法会自动生成一个键和一个图例,并为不同的线分配颜色,这些线与我们要绘制的数据帧的列相对应。 让我们看一下该序列的图,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NiG9odyA-1681367023203)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/a9f2ddad-23fa-4e90-a86d-bda81a76c508.png)]
它有些先进,但是您可以看到,我们仍然可以使用序列创建这些图。
让我们指定一个参数ylim
,以使该序列中绘图的比例与该数据帧的绘图的比例相同,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6OKUFi56-1681367023203)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/557c70de-1db8-4e6f-9a9b-0bf5cd2d3d48.png)]
现在让我们看一些不同的绘图。 在下一个屏幕截图中,让我们看一下该序列中值的直方图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbfsirUD-1681367023203)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/2e7285e5-5f0b-44f3-801a-f7d89021ab49.png)]
直方图是确定数据集形状的有用方法。 在这里,我们看到一个大致对称的钟形曲线形状。
我们还可以使用plot
方法创建直方图,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jvxu3O3b-1681367023203)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/8d05d1b8-215e-40ef-8050-efe87687da73.png)]
核密度估计器实际上是平滑的直方图。 使用直方图,您可以创建箱并计算数据集中有多少观测值落入这些箱中。 核密度估计器使用另一种方式来创建图,但是最终得到的是一条平滑曲线,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lz6hmweQ-1681367023204)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/da87e71f-7e74-4658-abde-d8c4dd7110ce.png)]
让我们看看其他绘图。 例如,我们为数据帧创建箱形图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BLyra0MJ-1681367023204)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/1f90164f-7d97-47e4-bea8-fa819a6a01ee.png)]
我们还可以创建散点图,并且在创建散点图时,我们需要指定哪一列对应x
值,哪一列对应y
值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MpH06857-1681367023204)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/d4dc7567-67a6-4a3f-a283-fcb60f4dce26.png)]
这里有很多数据点。 另一种方法是使用所谓的十六进制箱图,您可以将其视为 2D 直方图。 它计算落入真实平面上某些六角形面元的观测值,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I8yAgOxM-1681367023205)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/7b623069-150a-4a5f-aefc-41e7e726ee86.png)]
现在,这个十六进制图似乎不是很有用,所以让我们将网格大小设置为25
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P20Dax7c-1681367023205)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c4554dd2-424d-4d7e-b872-7135a68479a7.png)]
现在,我们有了一个更有趣的图,并且可以看到数据倾向于聚集的位置。 让我们计算图中各列的标准偏差,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DCbziFNt-1681367023205)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/e01dfd05-11fa-4379-8b97-be946ca88415.png)]
现在,让我们创建一个条形图以可视化这些标准偏差,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LP3XLzQM-1681367023205)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/c00d3910-730c-4007-a5da-edbeae50378c.png)]
现在,让我们看一个称为散点图矩阵的高级工具,该工具可用于可视化数据集中的多个关系,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OlaACjiP-1681367023205)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/1668870c-31d7-4572-96f0-d215f0b89511.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dioMQEth-1681367023206)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/handson-data-analysis-numpy-pandas/img/7b6b1466-4a6a-4675-b673-6cc68cb69643.png)]
您可以创建更多图。 我诚挚地邀请您探索绘图方法,不仅是 Pandas 的绘图方法(我提供了许多示例的文档链接),而且还探讨了 Matplotlib。
总结
在本章中,我们从索引排序开始,并介绍了如何通过值进行排序。 我们介绍了层次聚类,并用层次索引对序列进行了切片。 最后,我们看到了各种绘图方法并进行了演示。
我们已经走了很长一段路。 我们已经建立了 Python 数据分析环境,并熟悉了基本工具。 祝