NumPy 和 Pandas 数据分析实用指南:1~6 全(下)

简介: NumPy 和 Pandas 数据分析实用指南:1~6 全

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_lengthspecies列:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]

我们经常这样做,因为这些对象已被详尽地使用。 在这里,我们创建两个序列,一个由数字1234组成,另一个由字母abc组成:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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序列中添加两个新城市,分别是SeattleDenver。 结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 提供的方法可以使我们清楚地说明我们要如何编制索引。 我们还可以区分基于序列索引值的索引和基于对象在序列中的位置的索引,就像处理列表一样。 我们将关注的两种方法是locilocloc专注于根据序列的索引进行选择,如果我们尝试选择不存在的关键元素,则会出现错误。iloc就像我们在处理 Python 列表一样建立索引; 也就是说,它基于整数位置进行索引。 因此,如果我们尝试在iloc中使用非整数进行索引,或者尝试选择有效整数范围之外的元素,则会产生错误。 有一种hybrid方法ix,其作用类似于loc,但是如果传递的输入无法针对索引进行解释,则它的作用将类似于iloc。 由于ix的行为模棱两可,因此我建议大多数时候坚持使用lociloc

让我们回到我们的例子。 事实证明,在这种情况下,方括号的索引类似于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)]

切片数据帧

在讨论切片序列之后,让我们谈谈切片数据帧。 好消息是,在谈论序列切片时,许多艰苦的工作已经完成。 我们介绍了lociloc作为连接方法,但它们也是数据帧方法。 毕竟,您应该考虑将数据帧视为多个列粘合在一起的序列。

现在,我们需要考虑从序列中学到的知识如何转换为二维设置。 如果我们使用括号表示法,它将仅适用于数据帧的列。 我们将需要使用lociloc来对数据帧的行进行子集化。 实际上,这些方法可以接受两个位置参数。 根据我们前面描述的规则,第一个位置参数确定要选择的行,第二个位置参数确定要选择的列。 可以发出第二个参数来选择所有列,并将选择规则仅应用于行。 这意味着我们应该将第一个参数作为冒号,以便在我们选择的列中更加挑剔。

lociloc将在它们的两个参数上加上基于索引的索引或基于整数位置的索引,而ix可能允许混合使用此行为。 我不建议这样做。 对于后来的读者来说,结果太含糊了。 如果要混合lociloc的行为,建议使用方法链接。 也就是说,如果要基于索引选择行,而要基于整数位置选择列,请首先使用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的属性,我可以轻松地获得一个表示第一列中数据的序列。 接下来,我们看到lociloc的行为。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)]

由于df2df的独立副本,因此请注意,在创建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。

在以下屏幕截图中,我们有两个序列,srs1srs2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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。从技术上讲,这两个序列的长度是相同的,但是并不意味着这些元素将按照您的预期进行匹配。 例如,让我们考虑以下代码。 当我们添加srs1srs2时会发生什么?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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。 虽然这些方法适用于具有通用数据类型的数据帧,但是不能保证它们将适用于所有数据帧。

数据帧的函数应用

毫不奇怪,数据帧提供了函数应用的方法。 您应注意两种方法:applyapplymapapply带有一个函数,默认情况下,将该函数应用于与数据帧的每一列相对应的序列。 产生的内容取决于函数的功能。 我们可以更改applyaxis参数,以便将其应用于行(即跨列),而不是应用于列(即跨行)。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.meandf.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)]

还记得自定义ufunctrunk吗? 它不会给我们一个数据帧,但是它将求值并返回类似于数据帧的内容,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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函数; 我们还可以使用序列和数据帧提供的isnullnotnull方法进行检测。 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可以取的可能值。 因此,对于第一级,我们有ab; 对于第二级,alphabeta; 对于第三级,12。 然后,我们为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)]

然后我们将其进一步缩小到balpha; 结果如下。 这将是该序列的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,则需要在中间放置一个冒号,以表示我们不在乎是否有alphabeta,结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]

然后我们通过缩小balpha进行重复,但是请注意,我们现在必须使用元组以确保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 数据分析环境,并熟悉了基本工具。 祝

相关文章
|
6天前
|
数据采集 数据可视化 数据挖掘
Pandas数据应用:天气数据分析
本文介绍如何使用 Pandas 进行天气数据分析。Pandas 是一个强大的 Python 数据处理库,适合处理表格型数据。文章涵盖加载天气数据、处理缺失值、转换数据类型、时间序列分析(如滚动平均和重采样)等内容,并解决常见报错如 SettingWithCopyWarning、KeyError 和 TypeError。通过这些方法,帮助用户更好地进行气候趋势预测和决策。
98 71
|
5天前
|
存储 数据采集 数据可视化
Pandas数据应用:电子商务数据分析
本文介绍如何使用 Pandas 进行电子商务数据分析,涵盖数据加载、清洗、预处理、分析与可视化。通过 `read_csv` 等函数加载数据,利用 `info()` 和 `describe()` 探索数据结构和统计信息。针对常见问题如缺失值、重复记录、异常值等,提供解决方案,如 `dropna()`、`drop_duplicates()` 和正则表达式处理。结合 Matplotlib 等库实现数据可视化,探讨内存不足和性能瓶颈的应对方法,并总结常见报错及解决策略,帮助提升电商企业的数据分析能力。
101 73
|
2月前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
85 0
|
2天前
|
存储 数据采集 数据可视化
Pandas数据应用:医疗数据分析
Pandas是Python中强大的数据操作和分析库,广泛应用于医疗数据分析。本文介绍了使用Pandas进行医疗数据分析的常见问题及解决方案,涵盖数据导入、预处理、清洗、转换、可视化等方面。通过解决文件路径错误、编码不匹配、缺失值处理、异常值识别、分类变量编码等问题,结合Matplotlib等工具实现数据可视化,并提供了解决常见报错的方法。掌握这些技巧可以提高医疗数据分析的效率和准确性。
39 22
|
7天前
|
数据采集 数据可视化 索引
Pandas数据应用:股票数据分析
本文介绍了如何使用Pandas库进行股票数据分析。首先,通过pip安装并导入Pandas库。接着,从本地CSV文件读取股票数据,并解决常见的解析错误。然后,利用head()、info()等函数查看数据基本信息,进行数据清洗,处理缺失值和重复数据。再者,结合Matplotlib和Seaborn进行数据可视化,绘制收盘价折线图。最后,进行时间序列分析,设置日期索引、重采样和计算移动平均线。通过这些步骤,帮助读者掌握Pandas在股票数据分析中的应用。
37 5
|
2月前
|
数据处理 Python
在数据科学领域,Pandas和NumPy是每位数据科学家和分析师的必备工具
在数据科学领域,Pandas和NumPy是每位数据科学家和分析师的必备工具。本文通过问题解答形式,深入探讨Pandas与NumPy的高级操作技巧,如复杂数据筛选、分组聚合、数组优化及协同工作,结合实战演练,助你提升数据处理能力和工作效率。
46 5
|
2月前
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
Pandas 和 NumPy 是 Python 中不可或缺的数据处理和分析工具。本文通过实际案例深入剖析了 Pandas 的数据清洗、NumPy 的数组运算、结合两者进行数据分析和特征工程,以及 Pandas 的时间序列处理功能。这些高级技巧能够帮助我们更高效、准确地处理和分析数据,为决策提供支持。
50 2
|
2月前
|
存储 数据采集 数据处理
效率与精准并重:掌握Pandas与NumPy高级特性,赋能数据科学项目
在数据科学领域,Pandas和NumPy是Python生态中处理数据的核心库。Pandas以其强大的DataFrame和Series结构,提供灵活的数据操作能力,特别适合数据的标签化和结构化处理。NumPy则以其高效的ndarray结构,支持快速的数值计算和线性代数运算。掌握两者的高级特性,如Pandas的groupby()和pivot_table(),以及NumPy的广播和向量化运算,能够显著提升数据处理速度和分析精度,为项目成功奠定基础。
39 2
|
2月前
|
存储 数据挖掘 数据处理
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第26天】Python 是数据分析领域的热门语言,Pandas 库以其高效的数据处理功能成为数据科学家的利器。本文介绍 Pandas 在数据读取、筛选、分组、转换和合并等方面的高效技巧,并通过示例代码展示其实际应用。
55 2
|
2月前
|
数据采集 数据可视化 数据挖掘
Python数据分析:Pandas库实战指南
Python数据分析:Pandas库实战指南