欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

全面掌握Pandas的探索性数据分析(第1-4章)

最编程 2024-01-15 12:20:06
...

一、处理不同种类的数据集

在本章中,我们将学习如何在 Pandas 中使用不同种类的数据集格式。 我们将学习如何使用 Pandas 导入的 CSV 文件提供的高级选项。 我们还将研究如何在 Pandas 中使用 Excel 文件,以及如何使用read_excel方法的高级选项。 我们将探讨其他一些使用流行数据格式的 Pandas 方法,例如 HTML,JSON,PKL 文件,SQL 等。

从 CSV 文件读取数据时使用高级选项

在本部分中,我们将 CSV 和 Pandas 结合使用,并学习如何使用read_csv方法读取 CSV 数据集以及高级选项。

导入模块

首先,我们将使用以下命令导入pandas模块:

import pandas as pd

要读取 CSV 文件,我们使用read_csv方法,如下所示:

df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1")
df.head()

为了执行基本导入,请将数据集的文件名传递给read_csv,并将结果数据帧分配给变量。 在以下屏幕截图中,我们可以看到 Pandas 已将数据集转换为表格格式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ign7K4MJ-1681365993779)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/cfe3ed2e-29c2-480d-8033-c65564c39388.png)]

高级读取选项

在 Python 中,pandas 具有read_csv方法的许多高级选项,您可以在其中控制如何从 CSV 文件读取数据。

处理列,索引位置和名称

默认情况下,read_csv将 CSV 文件第一行中的条目视为列名。 我们可以通过将header设置为None来关闭此功能,如以下代码块所示:

df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", header=None)
df.head()

输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EjBejX7u-1681365993781)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/e1f24ca1-344b-4700-bb36-38a6102167a3.png)]

指定另一行作为标题

您还可以通过将行号传递给header选项,从而从其他行(而不是默认的第一行)设置列名,如下所示:

df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", header=2)
df.head()

输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sIy8qaQ0-1681365993781)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/7bf7d1c8-8b22-4fe1-bdcf-82a45d868d85.png)]

将列指定为索引

默认情况下,read_csv在读取数据时分配一个默认的数字索引,该索引从零开始。 但是,您可以通过将列名传递给索引列选项来更改此行为。 然后,Pandas 会将索引设置为此列,如以下代码所示:

df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", index_col='Title')
df.head()

在这里,我们传递了电影标题作为索引名称。 现在,索引名称为Title,而不是默认的数字索引,如以下屏幕截图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i2Wf5zok-1681365993781)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/478b7fde-0165-48fc-a2a6-9b8207751094.png)]

选择要读取的列的子集

我们还可以选择读取 CSV 文件中特定列的子集。 为此,我们将列名作为列表传递,以使用columns选项,如下所示:

df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", usecols=['Title', 'Genre1'])
df.head()

前面的代码段的输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RA9liw3f-1681365993781)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/0f20610e-b198-4572-9084-ab850b82c096.png)]

处理缺失和不适用的数据

接下来,我们将看到如何通过读取 CSV 文件来处理丢失的数据。 默认情况下,read_csv认为缺少以下值并将其标记为NaN

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tPLgKLYF-1681365993782)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/c330d7f5-b1c0-4fc8-8fb2-d4bf7a5eb8a7.png)]

但是,您可以添加到此列表。 为此,只需将要视为NaN的值列表传递给,如以下代码所示:

df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", na_values=[''])

选择是否跳过空白行

有时整行没有值; 因此,我们可以在读取数据时选择处理这些行。 默认情况下,read_csv会忽略空白行,但是我们可以通过将skip_blank_lines设置为False来关闭此行,如下所示:

df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", skip_blank_lines=False)

数据解析选项

我们可以通过读取 CSV 文件来选择跳过哪些行。 我们可以将行号作为列表传递给skiprows选项。 第一行的索引为零,如下所示:

df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", skiprows = [1,3,7])
df.head()

输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6dLNioEl-1681365993782)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/80076b18-0c73-4252-b86f-f088e6ed6dad.png)]

从文件的页脚或结尾跳过行

要从页脚或文件末尾跳过行,请使用skipfooter选项并传递一个数字,该数字指定要跳过的行数。 在以下代码中,我们通过了2。 如我们所见,在跳过最后两行之后,我们创建的上一个数据帧与我们创建的数据帧之间存在差异:

df.tail(2)
df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", skipfooter=2, engine='python')
df.tail(2)

以下屏幕截图显示了输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52VoYXK4-1681365993783)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/c874e464-2cf3-4677-9828-2202c05a536b.png)]

读取文件的子集或一定数量的行

有时数据文件太大,我们只想看一下前几行。 我们可以通过将要导入的行数传递到nrows选项来做到这一点,如以下代码所示。 在这里,我们将100传递给nrows,然后nrows仅读取数据集中的前一百行:

df = pd.read_csv('IMDB.csv', encoding = "ISO-8859-1", nrows=100)
df.shape

从 Excel 文件读取数据

在本节中,我们将学习如何使用 Pandas 使用 Excel 数据来处理表格,以及如何使用 Pandas 的read_excel方法从 Excel 文件中读取数据。 我们将阅读并探索一个真实的 Excel 数据集,并使用 xplore 解析一些可用于解析 Excel 数据的高级选项。

熊猫内部使用 Python Excel 库rd从 Excel 文件中提取数据。 我们可以通过执行conda install xlrd来安装它。

首先,请确保命令行程序在安装前以管理员模式运行,如以下屏幕截图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hqR0ome3-1681365993783)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/aa1344e7-c572-4fdf-add1-89fc1e472e84.png)]

以下屏幕截图显示了我们将使用 Pandas 阅读和探索的 Excel 数据集:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9elLockQ-1681365993783)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/184c0d1e-e396-4c78-91af-0ba3ee54aaab.png)]

上一个屏幕截图是电影分级的集合,可以在这里找到它

基本的 Excel 读取

我们正在使用 Pandas 的read_excel方法读取此数据。 以最简单的格式,我们只是将想要的 Excel 数据集的文件名传递给read_excel方法。 pandas 将 Excel 文件中的数据转换为 Pandas 数据帧。 Pandas 内部为此使用 Excel rd库。 在这里,Pandas 已读取数据并在内存中创建了表格数据对象,我们可以在我们的代码中访问,浏览和操作,如以下代码所示:

df = pd.read_excel('IMDB.xlsx')
df.head()

前一个代码块的输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MckcRXon-1681365993783)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/2815fd21-3be7-4ffa-829b-85e735677409.png)]

pandas 有很多高级选项,我们可以使用它们来控制应如何读取数据。如以下屏幕截图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PZMt27WL-1681365993784)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/5a286568-dfd0-4d26-8ce9-1805adc4690b.png)]

指定应读取的工作表

要指定应读取的纸张,请将值传递给sheetname选项。 如下面的屏幕快照所示,我们只是传递0,它是 Excel 工作表中第一张工作表的索引值。 这非常方便,尤其是当我们不知道确切的工作表名称时:

df = pd.read_excel('IMDB.xlsx', sheetname=0)
df.head()

输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OTCCD8aF-1681365993784)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/821fc1c4-66e5-4d78-8833-5a18bd54d4dd.png)]

从多张表读取数据

Excel 数据集文件附带数据和多个工作表。 实际上,这是许多用户更喜欢 Excel 而不是 CSV 的主要原因之一。 幸运的是,Pandas 支持从多张纸中读取数据。

查找工作表名称

要找出工作表的名称,请将 Excel 文件传递到ExcelFile类,然后在结果对象上调用sheet_names属性。 该类将 Excel 文件中的图纸名称打印为列表。 如果我们想从名为data-movies的工作表中读取数据,它将类似于以下代码片段:

xls_file = pd.ExcelFile('IMDB.xlsx')
xls_file.sheet_names

接下来,我们在之前创建的 Excel 文件对象上调用parse方法,并传入我们想要读取的工作表名称。 然后我们将结果分配给两个单独的数据帧对象,如下所示:

df1 = xls_file.parse('movies')
df2 = xls_file.parse('by genre')
df1.head()

现在,我们从两个单独的数据帧,中的两个工作表中获取数据,如以下屏幕截图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LH90uqdh-1681365993784)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/51df758b-0331-47f7-9f5a-d53195e29b7f.png)]

选择标题或列标签

默认情况下,pandas 会将列名称或标题设置为 Excel 文件中第一个非空白行的值。 但是,我们可以更改此行为。 在以下屏幕截图中,我们将值3传递给header选项,该选项告诉read_excel方法设置索引行3中的标题名称:

df = pd.read_excel('IMDB.xlsx', sheetname=1, header=3)
df.head()

前面代码的输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vQsmgV7T-1681365993785)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/12d7f628-5b08-4cfa-9919-306cca42da97.png)]

没有标题

我们还可以告诉read_excel忽略标题并将所有行都视为记录。 只要 Excel 没有标题行,就很方便。 为此,我们将header设置为None和,如以下代码所示:

df = pd.read_excel('IMDB.xlsx', sheetname=1, header=None)
df.head()

输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5eoCmwDR-1681365993785)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/a1b88a66-420f-4bb6-ac46-103fd63509d4.png)]

在开头跳过行

要跳过文件开头的行,只需将skiprows设置为要跳过的行数,如以下代码所示:

df = pd.read_excel('IMDB.xlsx', sheetname=1, skiprows=7)

在末尾跳过行

为此,我们使用skip_footer选项,如下所示:

df = pd.read_excel('IMDB.xlsx', sheetname=1, ski_footer=10)

选择列

我们还可以选择只读取列的子集。 这是通过将parse_cols选项设置为数值来完成的,这将导致将列从0读取到我们设置解析列值的任何索引。 我们在这种情况下设置了parse_cols=2,它将读取 Excel 文件中的前三列,如以下代码片段所示:

df = pd.read_excel('IMDB.xlsx', sheetname= 0, parse_cols=2)
df.head()

以下是输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-te3fv8nQ-1681365993785)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/cbc17e06-e0cb-4693-a19d-1d2e8101bc39.png)]

列名

我们可以选择给列使用不同的名称,而不是标题行中提供的默认名称。 为此,我们将列名列表传递给names参数,如下所示:

df = pd.read_excel('IMDB.xlsx', sheetname=0, parse_cols = 2, names=['X','Title',
   'Rating'], )
df.head()

在下面的屏幕截图中,我们将列名设置为读取时传递的名称:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jVWkA0tG-1681365993786)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/cb689dbe-dff6-448e-ad42-896429b363f3.png)]

读取数据时设置索引

默认情况下,read_excel用数字索引标记零,从0开始。 我们可以将索引或行标签设置为更高的值或我们的选择。 为此,我们将数据集的列名传递给index_col选项。 在以下代码中,我们将索引设置为Title列:

df = pd.read_excel('IMDB.xlsx', sheetname=0, index_col='Title')
df.head()

输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tebZ7Fwx-1681365993786)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/75fb95a9-93d5-4196-aff7-d4bfa3c1541e.png)]

读取时处理丢失的数据

read_excel方法有一个值列表,它将被视为丢失,然后将其设置为NaN。 我们可以在使用na_values参数传递值列表时添加此代码,如以下代码所示:

df = pd.read_excel('IMDB.xlsx', sheetname= 0, na_values=[' '])

读取其他流行格式的数据

在本节中,我们将探索 Pandas 的功能,以读取和使用各种流行的数据格式。 我们还将学习如何从 JSON 格式,HTML 文件和 PICKLE 数据集中读取数据,并且可以从基于 SQL 的数据库中读取数据。

读取 JSON 文件

JSON 是用于结构化数据的最小可读格式。 它主要用于在服务器和 Web 应用之间传输数据,以替代 XML,如以下屏幕快照所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tRE9KXfZ-1681365993786)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/c67f9d24-a64c-43d4-9f07-d5eccf714d35.png)]

将 JSON 数据读入 Pandas

为了读取 JSON 数据,pandas 提供了一种名为read_json的方法,其中我们传递了要读取的 JSON 数据文件的文件名和位置。 文件位置可以是本地文件,甚至可以是具有有效 URL 方案的互联网。 我们将结果数据帧分配给变量DF

read_json方法读取 JSON 数据并将其转换为 Pandas 数据帧对象,即表格数据格式,如以下代码所示。 JSON 数据现在可以以数据帧格式轻松访问,可以更轻松地进行操作和浏览:

movies_json = pd.read_json('IMDB.json')
movies_json.head()

上一个代码块将产生以下输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CvZzDtEF-1681365993786)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/4a1818ca-391b-48cb-9593-35960d5553bf.png)]

读取 HTML 数据

pandas 内部使用lxml Python 模块读取 HTML 数据。 您可以通过执行conda install lxml,从命令行程序安装它,如以下屏幕截图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f3rZVar7-1681365993787)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/7b60aa19-d51d-43a7-bd80-bd26473a7a62.png)]

我们还可以从本地文件甚至直接从互联网导入 HTML 数据:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qjrkrjRV-1681365993787)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/5ef932a6-3683-46dd-ac95-62d223a07840.png)]

在这里,我们将 HTML 文件或 URL 的位置传递给read_html方法。read_html从 HTML 提取表格数据,然后将其转换为 Pandas 数据帧。 在以下代码中,我们以表格格式获取了从 HTML 文件提取的数据:

pd.read_html('IMDB.html')

输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cMklbwZ2-1681365993787)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/86a8b673-bec2-4b09-82aa-a733b9ab7cdc.png)]

读取 PICKLE 文件

酸洗是将任何类型的 Python 对象(包括列表,字典等)转换为字符串的一种方式。 这个想法是,该字符串包含在另一个 Python 脚本中重构对象所需的所有信息。

我们使用read_pickle方法读取我们的 PICKLE 文件,如以下代码所示。 与其他数据格式一样,Pandas 根据读取的数据创建数据帧:

df = pd.read_pickle('IMDB.p')
df.head()

输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OcIPSb2g-1681365993787)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/db67347d-5356-40ff-a4ec-38485abb9f6b.png)]

读取 SQL 数据

在这里,我们将从流行的数据库浏览器 SQLite 中读取 SQL 数据,可以通过执行以下命令进行安装:

conda install sqlite

然后,我们将导入 SQLite Python 模块,如下所示:

import sqlite3

然后,创建与您要从中读取数据的 SQLite DB 的连接,如下所示:

conn = sqlite3.connect("IMDB.sqlite")
df = pd.read_sql_query("SELECT * FROM IMDB;", conn)
df.head()

接下来,使用read_sql_query方法将您想要数据来自的 SQL 查询传递给 Pandas。 该方法读取数据并创建一个数据帧对象,如以下屏幕快照所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2lyUoYyA-1681365993788)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/32c75475-e20d-444a-8ea0-6ecfa43181f7.png)]

此演示使用了 SQLite 数据库,但您也可以从其他数据库读取数据。 为此,只需调用适当的 DB Python 模块即可。

从剪贴板读取数据

要从剪贴板读取数据,请先复制一些数据。 在以下示例中,我们从电影数据集中复制了一个表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kkFiNwKF-1681365993788)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/977c5f6c-2735-454e-8c8e-a9800074f7ed.png)]

接下来,使用 pandas 的read_clipboard方法读取数据并创建一个数据帧,如下所示:

df = pd.read_clipboard()
df.head()

从网页复制的数据现在作为数据帧存储在内存中,如以下屏幕截图所示。 在将数据快速导入 Pandas 时,此方法非常方便:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rHH7ecdk-1681365993788)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/90b4fbce-54bd-483c-909f-055ceb2efdd8.png)]

总结

在本章中,我们学习了如何在 Pandas 中使用不同种类的数据集格式。 我们学习了在导入 CSV 文件时如何使用 Pandas 提供的高级选项。 我们还看到了如何使用 Excel 数据集,并且探讨了可用于处理各种数据格式(例如 HTML,JSON,PICKLE 文件,SQL 等)的方法。

在下一章中,我们将学习如何在高级数据选择中使用 Pandas 技术。

二、数据选择

在本章中,我们将学习使用 Pandas 进行数据选择的高级技术,如何选择数据子集,如何从数据集中选择多个行和列,如何对 Pandas 数据帧或一序列数据进行排序,如何过滤 Pandas 数据帧的角色,还学习如何将多个过滤器应用于 Pandas 数据帧。 我们还将研究如何在 Pandas 中使用axis参数以及在 Pandas 中使用字符串方法。 最后,我们将学习如何更改 Pandas 序列的数据类型。

首先,我们将学习如何从 Pandas 数据帧中选择数据子集并创建序列对象。 我们将从导入真实数据集开始。 我们将介绍一些 Pandas 数据选择方法,并将这些方法应用于实际数据集,以演示数据子集的选择。

在本章中,我们将讨论以下主题:

  • 从数据集中选择数据
  • 排序数据集
  • 使用 Pandas 数据帧过滤行
  • 使用多个条件(例如 AND,OR 和 ISIN)过滤数据
  • 在 Pandas 中使用axis参数
  • 更改 Pandas 序列的数据类型

数据集简介

我们将使用 zillow.com 的真实数据集,这是一个在线房地产市场,其发布房价数据集是他们研究工作的一部分。 这些数据集可在公共领域获得,并在归属于 zillow.com 后可免费使用。 我们将使用有关美国地区平均房价的最新数据。 它是 CSV 数据集,或带有 CSV 的文本文件。 让我们首先将 pandas 模块导入到 Jupyter 笔记本中,如下所示:

import pandas as pd 

然后,我们将读取数据集。 由于它是 CSV 文件,因此我们正在使用 Pandas 的read_csv方法。 我们将文件名(以逗号作为分隔符)传递给read_csv方法,并从此数据中创建一个数据帧,我们将其命名为data

我们收到的数据集是 CSV 文件的形式; 因此,我们将使用普通 Pandasread_csv方法。 我们需要传递文件名和逗号作为分隔符。 以下代码块将创建一个名称为data的数据帧:

data = pd.read_csv('data-zillow.csv', sep=',')

创建了数据帧之后,现在我们将从数据集中读取一些记录。 这可以通过在数据帧上调用head方法(data.head())来完成。 这将为输出提供列,例如Date和一些位置字段,例如RegionNameStateMetroCounty。 最后一列标题Zhvi是 Zillow 术语,是该特定区域的平均房价,如以下屏幕截图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IX4syqLM-1681365993789)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/e1b79359-450f-4f42-ab28-f5e1072f2c65.png)]

从数据集中选择数据

我们将从数据帧中选择作为 Pandas 序列的列,这可以通过两种方式完成。 第一种方法是对此选择使用方括号表示法,如以下代码块所示:

regions = data['RegionName'] 

通过传递RegionName列,我们将获得一个series对象。 此series对象将仅包含来自此特定列的值。 我们如何确定这是series对象? 我们可以通过传递为type函数创建的series对象进行检查,如下所示:

type(regions) 

现在,让我们看一下刚刚创建的series对象中的数据:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dIfy2tAs-1681365993789)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/9bf448c1-0ac9-4b98-87b9-575f5b829412.png)]

让我们找出 Pandas 数据帧和 Pandas 序列之间的区别。 Pandas 数据帧是带有标签行和列的多维表格数据结构。 序列是包含单列值的数据结构。 Pandas 的数据帧可以视为一个或多个序列对象的容器。

多列选择

要从一个数据帧中选择多个列,我们需要将这些列作为列表传递给数据帧,如下所示:

region_n_state = data[['RegionName', 'State']] 
region_n_state.head() 

现在,让我们使用type函数确认生成的对象是序列对象还是数据帧,如下所示:

type(region_n_state)

以下是输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7vjJ1zOc-1681365993789)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/dab57015-7753-4026-9211-ffccb1e7da5c.png)]

从前面的屏幕快照中可以看出,选择多个列将创建另一个数据帧,而仅选择一个列将创建series对象。

点表示法

还有另一种方法可以根据从数据帧中选择的数据子集来创建新序列。 此方法称为点表示法。 在此方法中,列名将像传递属性时一样传递给数据帧,而不是作为参数传递:

data.State

以下是输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I0ijqWXB-1681365993789)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/861af15c-1d46-4634-a794-80ee02da7f57.png)]

我们可以选择多个序列,然后从中创建新序列。 我们将使用三列CountyMetroState创建一个新序列。 然后我们将这些序列连接起来,并在数据帧中创建一列称为Address。 让我们看一下刚刚创建的新创建的列或序列:

data['Address'] = data.County + ', ' + data.Metro + ', ' + data.State

输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o5ALhrZp-1681365993790)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/80f5fbde-9419-48fe-8538-2d04b5aad7a9.png)]

从 Pandas 数据帧中选择多个行和列

在本节中,我们将学习更多有关从读取到 Pandas 的数据集中选择多个行和列的方法的信息。 我们还将介绍一些 Pandas 数据选择方法,并将这些方法应用于实际数据集,以演示数据子集的选择。

首先,我们导入 Pandas 并以与上一节相同的方式从 zillow.com 读取数据。 这样做如下:

import pandas as pd 
zillow = pd.read_table('data-zillow.csv', sep=',') 
zillow.head() 

输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RRZvMlV7-1681365993790)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/8377551b-4590-4cfa-97ae-97bcfc536aff.png)]

接下来,让我们看一些使用此数据集选择行和列的技术。 Pandas 有一种选择行和列的方法,称为loc。 我们将使用loc方法从之前创建的数据集中调用数据帧。loc要求两个参数之间用逗号分隔,其中第一个参数是要选择的行,第二个参数是要选择的列,如以下代码块所示:

zillow.loc[7, 'Metro'] 

如前面的命令所示,我们将7作为要选择的行的索引,并且将名称为Metro的列作为要选择的列。 这为我们提供了索引为7的行和列为Metro的值。

我们还可以通过按索引而不是列名来引用列来实现此选择。 为此,我们将使用iloc方法。 在iloc方法中,我们需要将行和列都作为索引号传递。 如以下屏幕截图所示,两种方法的结果相同:

zillow.iloc[7,4]

以下是前一个代码块的输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-imIftYJP-1681365993790)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/a61d5ed5-ac7f-4a4f-966c-044360cdaf8e.png)]

选择单行和多列

在本节中,我们将查看单行和多列的记录,其中我们将多列作为列表传递:

zillow.loc[7, ['Metro', 'County']] 

我们从具有索引7以及MetroCounty列的行中获取值。 如果我们选择一行,则这些值将垂直显示,而不是水平显示。 我们可以使用iloc方法而不是loc将此调用转换为使用列索引而不是列名,如下所示:

zillow.iloc[7, [4,5]]

输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LtBoBXtI-1681365993790)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/3f95acd9-e1ce-4fa1-b26d-f2b8903a3e31.png)]

现在,我们将学习如何选择一个单行,但要选择所有列中的值。 对于参数的列部分,我们使用冒号(:)。 这告诉loc方法选择所有列:

zillow.loc[11, :]

输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oGdOEsIm-1681365993791)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/1bf4d056-8840-4178-a2ab-0c907727d277.png)]

接下来,我们将学习如何从多行和单列中选择值。 在这里,我们需要将行作为行的序列来传递。 我们将索引号从101105(包括两端)的行传递。 我们将列名作为参数列表的第二部分传递,如下所示:

zillow.loc[101:105, 'Metro'] 

在这里,我们具有来自多行和一列的值。 接下来,我们从多个行和多个连续的列中选择数据; 就像行索引范围一样,我们将列名作为范围传递,如下所示:

zillow.loc[201:204, "State":"County"] 

如果要传递列索引而不是列名,我们还可以使用iloc方法来实现此目的,如下所示:

zillow.iloc[201:205, 3:6] 

我们得到的结果与以前相同。 现在,我们将研究选择多个不连续的值,我们只需要将列名作为列表传递,如下面的代码所示:

zillow.loc[201:205, ['RegionName', 'State']]

输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5FP8fSg4-1681365993791)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/63443760-aeaf-4f53-9190-78df352d94fc.png)]

从行和所有列的范围中选择值

在这里,我们将使用loc方法查看行和列序列中的值。 为此,loc方法的第一个参数是要选择的行的范围索引。 由于我们需要所有列中的值,因此我们将冒号(:)作为第二个参数,如下所示:

zillow.loc[201:205, :] 

在以下屏幕截图中可以看到输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u1GfI0IO-1681365993791)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/9f782b6f-f64c-4b85-8926-2ee4c3e33435.png)]

选择不连续的行也可以类似的方式工作。 在非连续行方法中,我们将行索引作为列表传递给loc方法,如以下代码所示:

zillow.loc[[0,5,10], :]  

输出结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3cVZbvW2-1681365993791)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/55885cab-9c1e-4f90-9fa4-5a4881714d78.png)]

假设我们要基于某个列的值选择行和列。 以下代码行显示我们正在选择County列的值为Queens的行:

zillow.loc[zillow.County=="Queens"] 

现在,让我们根据不同列的值选择特定列的所有行。 在以下代码块中,我们从County列中为MetroNew York的行选择值:

zillow.loc[zillow.Metro=="New York", "County"] 

在以下屏幕截图中,我们可以从数据集中查看New York的所有县:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qREzVoB2-1681365993792)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/fc52ea5e-12c0-4d81-98ba-2630817069f5.png)]

对 Pandas 数据帧排序

在本节中,我们将学习 Pandas sort_values方法。 我们还将使用各种方法对 Pandas 数据帧进行排序,并学习如何对 Pandas series对象进行排序。

我们将首先导入 pandas 模块,然后从 zillow.com 将房价数据集读取到 Jupyter 笔记本中。 首先,让我们从简单的排序类型开始。 我们将使用 Pandas 的sort_values方法。 例如,假设我们要按Metro列对数据进行排序。 我们需要将Metro作为参数传递给sort_values方法,并在数据帧上调用该方法,如下所示:

zillow.sort_values('Metro') 

这表明数据已按Metro列排序,如以下屏幕截图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dz4rGCua-1681365993792)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/9dbedab3-d1c2-4b6c-b35e-9fbdc679427d.png)]

如果您发现默认情况下,Date列按升序排序。 我们可以更改排序顺序,为ascending参数赋予False的值,如以下代码块所示:

sorted = zillow.sort_values('Metro', ascending=False) 

ascending参数是可选的,当不传递时,默认情况下将其设置为True。 现在,我们将研究如何按不止一列对数据进行排序。 为此,我们需要将要对数据进行排序的列列表传递给sort_values方法的参数列,如下所示:

sorted = zillow.sort_values(by=['Metro','County']) 

现在已按Metro首先对数据进行排序,然后按County列进行排序; 也就是说,按照我们将它们传递给sort_values方法的顺序。 我们可以进一步对多列进行排序,并引入混合的升序。 例如,我们可以按三列排序:MetroCountyPrice列,如下所示:

sorted = zillow.sort_values(by=['Metro','County', 'Zhvi'], ascending=[True, True, False]) 
sorted.head() 

您必须已经注意到,我们在递增参数中传递了三个布尔值的列表。 这将对MetroCounty的排序顺序设置为升序,对于最后一列Zhvi的降序设置为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I9UtEFUd-1681365993792)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/f22650b2-0c34-46e3-8421-0172811fc7cf.png)]

接下来,我们了解如何对series对象进行排序。 首先,让我们创建一个序列。 让我们从数据集中选择RegionID列,然后创建一个序列,如下所示:

regions = zillow.RegionID 
type(regions) 

在对它进行排序之前,让我们使用regions.head()查看原始序列。 输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gmBtAvx4-1681365993792)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/98ed27f7-2652-4679-8227-d532cfbbac3c.png)]

现在,让我们通过调用sort_values方法对其进行排序。 由于数据集仅包含一列,因此我们无需传递任何列名。 因此,用于对数据进行排序的代码将为regions.sort_values().head(),并且输出将如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rNBvNCOf-1681365993793)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/2e38ec82-41b2-4465-b694-8373acfba5f6.png)]

过滤 Pandas 数据帧的行

在本节中,我们将学习从 Pandas 数据帧过滤行和列的方法,并将介绍几种方法来实现此目的。 我们还将学习 Pandas 的filter方法以及如何在实际数据集中使用它,以及基于将根据数据创建的布尔序列保护数据的方法。 我们还将学习如何将条件直接传递给数据帧进行数据过滤。

我们将首先导入 pandas 模块,然后从 zillow.com 中将房价数据集读取到 Jupyter 笔记本中。 首先,我们探索 Pandas 的filter方法来过滤数据。 我们可以使用filter方法过滤列。 为此,我们需要将列作为列表传递给filter方法的items参数,如下所示:

filtered_data = data.filter(items=['State', 'Metro']) 
filtered_data.head() 

输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MMLRwg4G-1681365993793)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/3cee634e-99f8-4ec7-8fce-0ebb53bcb71e.png)]

如您在前面的屏幕快照中所见,我们按StateMetro过滤了列,并使用过滤器列中的值创建了一个新的数据帧。 然后我们使用head方法显示过滤器数据。 接下来,我们使用filter方法使用正则表达式过滤列名称。 通过将正则表达式传递给regex参数来完成此操作,如下所示:

filtered_data = data.filter(regex='Region', axis=1) 
filtered_data.head() 

当我们打印出过滤数据时,我们可以看到它选择了名称为Region的两列,如以下屏幕截图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XgNCJx4F-1681365993793)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/6b548866-adda-4032-98e5-b69b66b7bc8d.png)]

filter方法不是过滤数据的唯一方法。 为了过滤行,我们可以使用一些有趣的技术-首先,我们创建布尔值序列。 布尔值序列基于我们数据集中的价格值列。 我们选择选择值大于500000的行,如下所示:

price_filter_series = data['Zhvi'] > 500000 
price_filter_series.head() 

我们通过从顶部打印一些值来确认创建了序列,如以下屏幕截图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ngv25mVS-1681365993793)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/639d0349-a7de-4a12-a6e3-88a0e69d0e05.png)]

如前面的屏幕快照所示,True值是与我们的条件匹配的值,即,它们表示价格高于500000的行。 接下来,我们使用该布尔序列来过滤完整数据集中的行,并仅获取价格高于500000的值。 为此,我们将方括号将布尔序列传递给数据集数据帧,如下所示:

data[price_filter_series].head() 

在不显式创建布尔序列的情况下筛选数据集的另一种方法是将所需值的条件直接传递给数据帧。 例如,假设我们只想过滤并选择房价高于或等于1000000的行。 我们将条件传递给数据帧如下:

data[data.Zhvi >= 1000000].head() 

以下屏幕快照显示了值大于1000000的记录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rjV0n8dw-1681365993794)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/master-exp-analysis-pandas/img/e12e7ee1-62dc-46e2-96bc-f1ea0d3d3e68.png)]

将多个过滤条件应用于 Pandas 数据帧

在本节中,我们将学习将多个过滤条件应用于 Pandas 数据帧的方法。 我们将使用逻辑 AND/OR 条件运算符从真实数据集中选择记录。 我们还将看到如何使用isin()方法来过滤记录。 我们将在真实数据集上演示isin方法用于单列和多列过滤。

我们将首先导入 pandas 模块并从 zillow.com 中将房价数据集读取到 Jupyter 笔记本中,如下所示:

data = pd.read_table('data-zillow.csv',