第 8 章:数据分析的高级工具

在本章中,我们将练习使用 Python 读入和探索数据。在此过程中,您将了解更多与编程相关的工具和概念。您将学习如何设置虚拟环境,这是使用库的一种包含的、本地化的方式。之后,我将向您展示如何导航 Web 应用程序 Jupyter Notebook,该界面可用于编写和修改代码、输出结果以及呈现文本和图表。最后,您将安装 pandas,这是一个让您能够进行统计分析的 Python 库。与前面的章节一样,您将通过实践练习吸收所有这些新知识——摄取和探索 Reddit 提交的数据。

使用 Jupyter Notebook

在前面的章节中,我们通过命令行界面和脚本使用了 Python。这是让我们以一种快速而直接的方式熟悉编码语言的好方法。

但是,随着我们建立 Python 技能并开始处理更复杂的脚本,我们应该研究工具使这些类型的项目更易于管理、结构化和共享。我们的脚本变得越复杂、越长,就越难跟踪分析的每一步。

这就是学习如何使用 Jupyter Notebook 会有所帮助的地方。 Jupyter 是一个开源 Web 应用程序,它在您的计算机本地运行,并在 Chrome 等浏览器中呈现。 Notebooks 允许我们分块运行我们的脚本,一次运行几行,使我们在迭代和改进代码时更容易调整部分代码。 Jupyter Notebook Web 应用程序是从 Web 应用程序 IPython Notebooks 演变而来的,旨在支持三种编程语言 — Julia、Python 和 R (Ju-Pyt-R) — 但此后已经发展为支持许多其他编码语言。

Jupyter Notebook 还被许多不同领域的数据科学家使用,包括人们处理数字以提高网站性能、社会学家研究人口统计信息,以及记者在通过信息自由法案请求获得的数据中搜索趋势和异常。这样做的一个巨大好处是,许多数据科学家和研究人员将他们的笔记本(通常包含详细和带注释的分析)放在 GitHub 等代码共享平台上,让像您这样的初学者更容易复制他们的研究。

设置虚拟环境

为了使用 Jupyter Notebook,您需要通过学习三个重要概念来将您的编码技能提升到一个新的水平。

首先,您需要能够创建和理解虚拟环境。虚拟环境可能很难让您头晕目眩,因此让我们缩小一分钟来检查它们的用途。

正如您在过去几章中看到的,每次我们想要使用编码库时,我们都必须通过在命令行界面 (CLI) 中输入命令来安装它们。每个库都安装在您计算机上的默认位置,在卸载之前它会一直保留在该位置。

对于刚开始使用库并且可能只需要一两个库的 Python 开发人员来说,这种方法可能就足够了。但是,随着您成为更老练的研究人员,您可能需要越来越多的图书馆来处理不同的任务。例如,某些任务可能需要一个能够从 PDF 图像文件中识别文本的库,而其他任务可能需要一个可以截取网站屏幕截图的库。随着您提高技能并处理更多不同的项目,您可能需要在此默认位置安装越来越多的库,这会导致它们之间发生冲突的风险。这是虚拟环境可以提供帮助的地方。

虚拟环境允许您仅在指定的环境中安装库。把它想象成为每个项目创建的平行宇宙,你可以在不影响整个计算机环境的情况下进行实验。虚拟环境就像您计算机中的另一台计算机。它使您能够利用编码库的强大功能,而不必担心它如何与机器的其他部分进行交互。

虽然您可以使用各种第三方工具来制作虚拟环境,但对于这个项目,我们将使用 Python 3 的内置虚拟环境工具。不过,首先,我们需要创建一个 python_scripts 项目文件夹来存储我们的 Jupyter 笔记本。完成后,打开 CLI 并导航到该文件夹。正如我们在第 3 章中看到的,通过 CLI 进入文件夹的命令是 cd(代表“更改目录”),后跟文件夹的路径。例如,如果您将 python_scripts 文件夹存储在 Mac 上的 Documents 文件夹中,则可以在 CLI 中键入以下命令并按 Enter:

cd Documents/python_scripts

对于 Windows,您将运行以下命令:

cd Documents\python_script

进入文件夹后,如果您是 Mac 用户,则可以通过运行以下命令来创建虚拟环境:

python3 -m venv myvenv

或此命令适用于 Windows 用户:

python -m venv myvenv

让我们分解这个命令。首先,我们告诉我们的 CLI 我们在 Mac 上使用与 python3 相关的命令,或者在 PC 上使用 python。然后我们使用 -m,一个标志告诉 Python 3 调用内置在编程语言中的模块(标志允许您在安装 Python 时访问安装在计算机上的不同功能)。在这种情况下,我们要使用虚拟环境模块 venv。最后但并非最不重要的一点是,我们为我们的虚拟环境命名,为简单起见,我们将其命名为“myvenv”(您可以将您的环境命名为您想要的任何名称,只要名称中没有空格)。

此命令应在您的项目文件夹中创建一个文件夹,并使用您为其指定的名称,在本例中为“myvenv”。这个子文件夹是我们将要安装的所有编码库的地方。

好的,您几乎可以在虚拟环境中玩游戏了!现在我们已经创建了这个虚拟环境,我们开始激活它。激活就像一个电灯开关,可以使用 CLI 命令打开和关闭您的环境。

如果您仍在包含您的 myvenv 子文件夹的文件夹中,您只需输入此命令即可激活或“打开”您的环境(如果没有,请先导航到包含您的 myvenv 子文件夹的文件夹) .在 Mac 上,这是命令:

source myvenv/bin/activate

在 Windows 上,您将使用命令提示符运行它:

myvenv\Scripts\activate.bat

让我们分解一下这段代码。单词 source 是一个内置命令,它允许我们运行包含在我们指定的路径中的任何源代码(源命令也可以用句点换出,因此行 .myvenv/bin/activate 将执行一样)。在这种情况下,路径是myvenv/bin/activate,它告诉计算机转到myvenv文件夹,然后是myvenv中的bin文件夹,最后是bin中的activate文件夹。 activate 文件夹包含一个脚本,可以“打开”您的环境。

运行此代码后,您的虚拟环境应该被激活!您可以通过查看命令行来判断您的环境是否已激活:它现在应该以字符串 (myvenv) 开头,包括括号。要停用或“关闭”您的环境,只需输入命令停用,字符串 (myvenv) 就会消失!

欢迎来到新的编程水平。现在您已经了解了如何创建和打开和关闭虚拟环境,我们可以开始设置 Jupyter Notebook。

组织笔记本

首先,让我们确保我们保持井井有条。虽然我们不需要遵守特定的文件夹结构,但通过尽早组织我们的输入数据、笔记本和输出数据,我们可以帮助防止以后分析中出现错误。尽早养成好习惯也比以后改掉坏习惯容易得多。

您需要创建三个单独的文件夹,它们存储在 myvenv 文件夹之外但在整个项目文件夹内。首先,您需要创建一个名为 data 的文件夹来存储输入数据,其中包含您从 API 或网站接收、下载或抓取并想要探索的文件。然后您需要一个输出文件夹,其中将包含您要根据分析导出的任何电子表格。我们不会在本书中创建电子表格,但对于数据分析师来说,拥有一个输出文件夹是一个很好的常见做法。我们将在第 143 页的“使用系列和数据框”中介绍 pandas 库,它提供了一个名为 .to_csv() 的简单函数,它允许我们根据分析创建“.csv”文件并且可以轻松搜索在谷歌上。最后,我们将把我们的 Jupyter 笔记本保存在一个名为 notebooks 的整洁文件夹中。

您可以在计算机上手动创建这些文件夹或目录,但也可以使用 mkdir 命令以编程方式创建它们。为此,请导航到 CLI 中的整个项目文件夹(如果您仍在“myvenv”文件夹中,请使用“cd ..”向上移动)并输入以下三行:

mkdir data
mkdir output
mkdir notebooks

命令 mkdir 使用您指定的名称创建一个目录。 在这种情况下,这三个命令创建了刚才描述的三个文件夹。

或者,您可以使用 mkdir 命令后跟由空格分隔的所有三个文件夹名称,如下所示:

mkdir data output notebooks

安装 Jupyter 并创建您的第一个 Notebook

Jupyter 允许我们创建可以读取不同类型代码的笔记本文档,例如 Python 和 Markdown,这是一种经常用于格式化文档的语言。 由于它能够阅读各种编码语言,笔记本可以将 Python 代码的结果与格式化文本一起呈现,使程序员更容易对他们的分析进行注释。

更好的是,我们可以从 Web 下载 Jupyter Notebook 并将其安装在我们的计算机上,就像任何其他 Python 库一样:通过 pip。 要安装 Jupyter Notebook,请打开 CLI 并输入以下命令:

pip install jupyter

现在,您可以通过从项目文件夹运行以下命令来启动它:

jupyter notebook

当您在 CLI 中输入此命令时,Jupyter Notebook 将启动一个本地服务器,该服务器仅在您的计算机上运行,并在您的默认 Web 浏览器中打开一个窗口,就本书而言,该窗口应该是 Chrome .

您可以在图 8-1 中看到 Jupyter Notebook 界面。

图 8-1:Jupyter 界面

此界面允许我们导航到文件夹并在其中创建文件。在本练习中,导航到 notebooks 文件夹,然后从下拉菜单中选择 New>Python3。这应该在 notebooks 文件夹中创建一个新笔记本并在新选项卡中打开它。

Jupyter 笔记本看起来很像普通的文本文档软件,具有编辑工具和完整的选项菜单,当然,除了它们是根据 Python 开发人员的需求量身定制的。它们的特别之处在于它们使用单元格一次一个地运行不同的 Python 代码块。换句话说,您可以将您的 Python 代码分成多个单元格,并一个一个地运行它们。

使用单元格

让我们试一试。默认情况下,您的笔记本会创建一个单元格,其中包含文本 In [ ]: 和一个文本字段,您可以在其中输入代码。在该单元格中,输入以下 Python 代码行:打印(“嗨”)

选择包含此代码的单元格,然后按“运行”按钮(或使用快捷键 shift-enter)。这应该会执行您刚刚在单元格中键入的 Python 代码。在这种情况下,笔记本应该直接在单元格下方打印代码的结果并创建第二个单元格,如图 8-2 所示。

图 8-2:Jupyter 笔记本中的两个单元格

恭喜! 你已经编写了你的第一个 notebook 并运行了你的第一个 Python 单元!

这里有一件重要的事情需要注意:现在 Jupyter 已经运行了你的单元格,单元格左边的方括号应该不再是空的。 由于这是我们在此笔记本中运行的第一个单元格,因此它们应包含数字 1。

当我们用不同的代码运行同一个单元格时会发生什么? 让我们来了解一下。 删除第一个单元格内的代码并输入以下代码:

print("Hello!")

现在通过单击单元格左侧的区域来选择单元格(蓝色条应突出显示您当前选择的任何单元格的左侧)。然后再次单击运行按钮。

单元格应该渲染字符串 Hello!,就像它之前渲染字符串 Hi 一样。但是现在方括号应该包含数字 2。 正如您所看到的,Jupyter Notebook 不仅跟踪您运行单元的事实,还跟踪您运行它的顺序。

这种跟踪非常重要,因为笔记本中的代码被分成多个单元格。与一次性从上到下运行的脚本不同,单元格可能会乱序运行,并且一次运行一个。跟踪会准确地告诉您笔记本已经运行了哪些代码以及它仍然需要运行哪些代码。这可以帮助您避免常见的 Jupyter 错误,例如当一个单元格中的代码引用您尚未运行的单元格中定义的变量时。

与 Microsoft Word 或 TextEdit 等文本编辑软件类似,Jupyter Notebook 在可视化界面中附带了许多出色的工具。您可以使用工具栏执行诸如保存笔记本(软盘图标)、剪切单元格(剪刀图标)、添加单元格(加号)以及向上(向上箭头)或向下(向下箭头)移动单元格之类的操作。

现在您了解了如何在 Jupyter Notebook 中运行 Python 代码单元的基础知识。但是,当您通过重写、重新运行、删除或移动单元格来改进您的 notebook 对代码进行更多实验时,您可能会发现在 notebook 的内存中存储了大量“垃圾”。例如,您可能会创建最终决定删除或存储以后意识到不会使用的数据的变量。这些垃圾会减慢您的笔记本速度。那么,如何在不破坏您在单元格中编写的代码行的情况下清除在笔记本中运行的任何 Python 代码的内存呢?

有一个可爱的技巧:转到菜单并选择 Kernel> Restart,这将清除所有以前运行的代码以及单元格旁边方括号内的任何数字。如果您再次运行一个单元格,它应该呈现您的代码结果并用数字 1 填充方括号。

最后但并非最不重要的是,有一个很好的选择可以按顺序运行多个单元格。为了说明这一点,让我们首先向我们的笔记本添加另一个单元格。单击加号 (+) 按钮,然后在第二个单元格中输入以下代码:

print("Is it me you're looking for?")

当我们在做的时候,为什么不再添加两个单元格呢? 一个单元格包含以下代码:

print("'Cause I wonder where you are")

另一个包含这行代码:

print("And I wonder what you do")

要按顺序运行所有四个单元格,请选择第一个单元格,其中包含行 print(“Hello!”)。然后选择菜单选项 Cell > Run All below。这应该会自动运行所有单元格,从我们选择的单元格开始,一直到底部。 (或者,如果一个单元格包含错误,我们的笔记本就会停在那里!)

Notebooks 可用于各种任务,这些基本步骤应该会让您开始探索 Jupyter Notebook 作为数据分析工具。您几乎可以将在脚本中编写的任何代码作为笔记本运行。您甚至可以使用之前为本书编写的脚本,将代码拆分为多个单元,并一次运行一段代码。

现在您已经了解了如何使用 Jupyter Notebook 界面,让我们转向使用 Pandas 探索 Reddit 数据。

什么是 pandas?

在本书中,您已经学会了如何使用各种库来帮助您收集数据。现在是时候了解一个可以帮助您分析数据的库了。

输入 pandas。

尽管您可能会猜到,大熊猫图书馆与原产于亚洲的可爱、笨手笨脚的熊无关。该库实际上得名于面板数据的概念——一个跨越时间测量的数据集——由其创建者韦斯麦金尼构建,用于处理大型纵向数据集。它允许 Python 从各种来源(包括 .csv、.tsv、.json 甚至 Excel 文件)摄取数据,从头开始创建数据集,并轻松合并数据集。

要使用 Pandas,就像使用 Jupyter 和其他库一样,我们首先必须使用 pip 安装它。如果到目前为止您已经按照所有说明操作并打开了笔记本,那么您还可以通过为 Jupyter Notebook 提供支持的 CLI 运行本地服务器。判断您的本地服务器当前是否正在运行 Jupyter Notebook 的一种方法是查找包含字母 I、时间戳和单词 NotebookApp 的括号,如下所示:[I 08:58:24.417 NotebookApp]。要在不中断本地服务器的情况下安装 pandas,您可以在终端中打开一个新窗口(让运行服务器的那个窗口保持打开状态!)或命令提示符,导航到相同的项目文件夹,再次打开虚拟环境,然后安装新图书馆。

按照这些步骤操作后,您可以执行此 pip 命令来安装 Pandas:

pip install pandas

安装库后,您需要导入它。 在 Jupyter Notebook 中执行此操作的最常规方法是在单元格中键入导入命令并运行它:

import pandas as pd

在这个示例导入命令中,我们已经导入了 pandas 并且将能够使用速记 pd 访问它的功能。 换句话说,当您使用此命令时,您将调用 pd,而不是在整个代码中将库称为 pandas。 因此,例如,您将编写 pd.Series([12,53,57]) 而不是 pandas.Series([12,53,57])。 此导入命令是许多使用 Pandas 的数据分析师使用的约定,有助于保持代码整洁和易于阅读。

现在让我们开始创建、读取和操作一些数据结构!

使用系列和数据框

我们可以加载到 Pandas 中的最简单的数据结构之一是系列,它类似于列表或数组。 要在 Pandas 中制作系列,我们可以使用 Series() 函数。

在包含 import pandas as pd 行的单元格下方的新单元格中,输入以下两行:

① numbers = [12, 53, 57]
② pd.Series(numbers)

该代码将数字列表 [12, 53, 57] 存储在 numbers 变量 ① 中。 在下一行中,我们通过它的简写 pd 调用 pandas 库,后跟一个句点,然后是 Series() 函数,我们将参数数字②传递给它。 换句话说,我们使用 Series() 函数创建一个类型为 series 的数据对象,并将数字列表放入这个系列中。 这与我们在第 4 章中访问另一个库 Beautiful Soup 中的函数的方式相同:我们首先通过分配给它的速记来引用该库,然后我们通过它们的名称访问它提供的函数。

一旦我们运行该单元格,笔记本应在其正下方显示以下文本:

0    12
1    53
2    57
dtype: int64

这就是pandas如何表示一个简单的数据系列,也可以称为一维数据集。在左侧,有一列表示每个数据项的索引或位置。按照惯例,索引从 0 开始,每行递增 1。右侧是实际数据值。在本系列的最后,您将看到用冒号分隔的 dtype(数据类型)和 int64(整数)这两个词。

注意 与 dtype 和 int64 类似,字符串由对象表示,浮点数由 float64 表示。还有其他数据类型,包括 datetime64,它代表日期和时间值,但我们现在不需要它们。

序列可能是最简单的一种数据集:它是一列数据,其中每一行都包含一个值。但在 Pandas 中,您更有可能使用能够处理多列的二维对象:数据框。将数据框视为由 Python 读取而不是在 Excel 或 Google 表格中打开的电子表格,并且可以容纳更多数据。与电子表格不同,数据框具有索引(行标签)和列(列标签)。

要制作数据框,您可以使用 Pandas 的内置 DataFrame() 函数。试一试吧。在新单元格中,输入以下字典和代码行:

① numbers2 = {"one": [1.2, 2, 3, 4],
              "two": [4, 3, 2.5, 1]}
pd.DataFrame(numbers2)

和以前一样,我们创建了一个变量来存储我们的数据:numbers2 ①。 然后我们为变量 numbers2 分配一个字典,其中键“one”被分配值列表 [1.2, 2, 3, 4] ,键“two”被分配值列表 [4, 3, 2.5, 1 ]。 我们在大括号内的这两个字典项之间添加了一个换行符,以提高可读性,但它不会干扰您的代码运行。

您可以在图 8-3 中看到 Jupyter 如何呈现此代码。

图 8-3:呈现为表格的两个单元格和一个数据框

像一个系列一样,这个数据框有一个索引,它在最左边显示为一列。数据框还有两列,分别命名为一和二,其中包含我们的数值数据。

读取和探索大数据文件

数据集具有各种规模和详细程度——有些相当容易理解,而有些则可能非常复杂、庞大且笨拙。社交媒体数据可能特别难以管理:在线用户产生大量数据和内容,进而可以产生许多反应、评论和其他响应。

当我们处理来自社交媒体公司、学者或其他数据档案员的原始数据时,这种复杂性可能会更加复杂。通常,研究人员会收集比单独分析所需的更多数据,因为对一个大数据集提出各种问题比为目标和范围可能发生变化的项目一遍又一遍地收集较小的数据集更容易。

由于 API 限制,研究人员、记者和其他分析师可能难以跟踪媒体操纵活动、拖钓攻击或其他短期在线现象。举一个例子,当国会发布俄罗斯特工用来操纵 2016 年美国大选的 Twitter 句柄和 Facebook 页面名称时,这些账户已被删除,研究人员无法再追踪以进行检查。

作为对策,各种机构和个人已经开始收集和存储这些社交媒体数据。例如,互联网档案馆每月进行一次数据提取,并在其服务器上托管数百万条推文,研究人员可将其用于语言或其他分析。学者们收集并存档了 Facebook 信息,试图更好地了解缅甸对穆斯林的仇恨蔓延等现象。

虽然这些努力对进行实证研究非常有帮助,但它们产生的数据可能会给像我们这样的数据侦探带来挑战。通常,我们必须花费大量时间研究、探索和“了解”数据,然后才能对其进行有意义的分析。

在接下来的几页中,您将学习如何阅读和探索一个如此大的数据文件。在本章和接下来的章节中,我们将看看由 Jason Baumgartner 提供的 Reddit 数据,Jason Baumgartner 是一位数据档案管理员,他认为将社交媒体数据提供给学者和其他类型的研究人员至关重要。该数据包含 2014 年至 2017 年间向 r/askscience、Reddit 论坛或“subreddit”提交的所有提交,人们在该论坛上提出与科学相关的问题。在本章的其余部分,我们将通过 Pandas 了解数据集的结构和大小。您可以在此处下载数据集:https://archive.org/details/askscience_submissions/。

下载数据后,您需要将其放入正确的文件夹中。在这种情况下,这是您之前创建的数据文件夹。

然后你需要去你创建的 Jupyter notebook。按照惯例,第一个单元格仍应包含 import pandas as pd 命令,因为所有导入语句都应首先运行。在之后的单元格中,按如下方式加载数据文件夹中的 .csv 电子表格:

reddit_data = pd.read_csv("../data/askscience_submissions.csv")

名称 reddit_data 指的是我们创建的变量,用于存储我们正在摄取的 Reddit 数据。然后,使用等号 (=),我们将此变量分配给我们使用 Pandas 函数 read_csv() 创建的数据框。 read_csv() 函数需要数据文件的路径作为参数(这通常是 .csv 文件,但 read_csv() 也可以处理 .tsv 和 .txt 文件,只要它们包含由逗号分隔的数据值、制表符或其他一致的分隔符),并且此参数需要是字符串。由于我们在 notebook 中运行命令,因此路径需要反映数据文件相对于 notebook 文件的位置。使用两个点和正斜杠允许我们导航到当前文件夹(notebooks)上一级的文件夹,在本例中是我们的项目文件夹(python_scripts)。然后我们导航到数据文件夹,其中包含您之前放置在文件夹中的名为 askscience_subsmissions.csv 的 .csv 文件。

注意数据超过300MB,加载可能需要几秒钟。将它加载到我的电脑上花了 10 秒钟。

一旦我们运行该单元格,pandas 将创建一个存储在变量 reddit_data 中的数据框。

查看数据

与 Excel 或 Sheets 等程序为用户构建以通过可视化界面操作数据不同,pandas 实际上不会一次渲染整个数据框。你可能已经注意到,刚才,pandas 根本没有渲染数据。这是因为您将 read_csv() 的输出分配给一个变量,存储而不是返回或打印它。如果您在未分配的情况下运行该函数,或运行包含 reddit_data 变量的单元格,您将看到数据片段。虽然这种截断起初可能会让人迷失方向,但它也节省了大量的计算能力。当您打开包含几十万行的文件时,某些软件可能会崩溃或变慢,具体取决于它们的复杂性。因此,通过不显示完整的数据框,pandas 使我们能够更有效地处理更大的数据集。

这意味着我们需要找到一种方法来读取数据集的不同部分。感谢 Pandas 开发人员,我们可以使用一些方便的功能轻松地做到这一点。

要查看数据集的前几行,我们可以使用一个名为 head() 的函数。此函数将整数作为其唯一参数,如果您不输入任何内容,则默认为 5。因此,如果您想查看数据集的前 10 行,可以使用以下行运行单元格:reddit_data.head(10)

在此命令中,我们首先调用 reddit_data 变量,该变量保存我们通过 .csv 文件摄取的数据。然后,我们对变量中的数据调用 head() 函数。 Jupyter Notebook 应呈现如图 8-4 所示的数据框。

图 8-4:渲染数据框的前 10 行

要查看数据框的最后 10 行,您可以使用 tail() 函数,该函数遵循相同的结构:

reddit_data.tail(10)

运行包含此代码的单元格后,除了数据框的最后 10 行之外,您将看到与使用 head() 函数时相同的数据框渲染。

虽然您无法一次看到整个数据集,但目前这可能并不那么重要。请记住,您现在正在了解您的数据集。这意味着您想知道每列包含什么类型的值以及列名是什么。查看数据的前 10 行或最后 10 行肯定会对此有所帮助。

但是,您可能已经注意到,您必须横向滚动才能显示数据集的每一列。这可能有点笨拙。幸运的是,您可以使用一些内置工具来帮助汇总数据集的各个部分。

您可以转置数据集,将列标题视为行,将数据视为列。转置允许我们基本上翻转数据框 - 它看起来有点像我们只是逆时针旋转了 90 度。为此,您将调用附加到带有 T 的数据集,如下所示:

reddit_data.T

要将所有列名称视为列表,您可以使用以下代码行:

reddit_data.columns

要获取数据框包含的所有数据类型的摘要,请使用 dtypes:

reddit_data.dtypes

最后,您可以使用旧的普通 Python 来找出数据框中的行数。 还记得我们在第 1 章中用来在交互式 shell 中显示信息的 print() 函数吗? 我们用它来查找字符串的长度或使用 len() 的列表中的项目数。 我们还可以使用这些函数来查看我们的数据框有多大:

print(len(reddit_data))

这段代码看起来可能比实际复杂。 首先我们使用len()函数来测量数据帧的长度(即它包含的行数),方法是向它传递参数reddit_data,这是我们的数据集。 换句话说,首先我们得到 reddit_data 数据帧的长度。 单独使用时,len() 函数仅在单元格内没有其他语句后才呈现结果,因此最好将它放在 print() 函数中以确保单元格呈现结果 len() 测量。

您应该得到的数字是 618576(或者,对人类来说更清晰的是 618,576)。 这表示我们数据框中的行数。

如果我们运行相同的函数集并将 reddit_data.columns 作为参数传递给 len(),我们可以获得数据框中的列数:

print(len(reddit_data.columns))

此行测量数据框中列列表的长度。 这个特定的数据框包含 65 个不同的列。 因此,如果将 65 列数据乘以 618,576 行,您会发现我们正在处理超过 4000 万个值。 欢迎来到大数据联盟!

查看特定的列和行

现在我们知道如何了解数据框的结构,这意味着我们知道如何鸟瞰数据。 但是,如果我们想仔细查看数据的特定部分怎么办? 这就是方括号的用武之地。

当附加到包含我们的数据框的变量时,方括号可以让我们选择或索引不同的数据子集。 例如,要查看特定列,您可以在括号内将列名指定为字符串。 在这一行中,我们选择名为 title 的列:

reddit_data["title"]

这让我们只关注包含归类为每个 Reddit 帖子标题的值的列。 有趣的事实:当单独运行时,这行代码将呈现列,但您也可以使用它在变量中存储数据列的副本,如下所示:

all_titles = reddit_data["title"]

我们还可以通过将它们的列表分配给另一个变量来查看带有括号表示法的多个列:

column_names  = ["author", "title", "ups"]
reddit_data[column_names]

首先,我们创建一个名为 column_names 的变量来将列名列表存储为字符串。 请记住,每个列名称必须是数据集本身中的确切字符串,包括大写。 然后我们将此列表放在括号内以仅显示那些列。

还有一些很好的方法可以隔离各个行。 正如我们在本章前面看到的,每一行都有一个索引,它的作用有点像一个标签。 默认情况下,pandas 为每一行分配一个整数作为索引(我们也可以为每一行分配自定义索引,但在本练习中不会这样做)。 我们可以使用 iloc[] 方法通过将行的索引号放在括号内来调用任何给定的行(在编程术语中,这称为基于整数位置的索引):

reddit_data.iloc[4]

如果我们用这条线运行一个单元格,我们应该看到数据集的第五行(记住编程通常从 0 开始计数)。

最后但并非最不重要的是,我们可以将这两种方法结合起来。 例如,如果我们想调用名为 title 的列并仅显示第五行中的值,我们可以这样做:

reddit_data["title"].iloc[4]

这些只是我们可以更好地了解我们的数据集的几种方式。 鉴于我们正在处理包含在本质上是一个大型电子表格中的数百万个值,这绝非易事。

现在您已经掌握了所有基础知识,您可以开始学习如何使用数据进行计算。

概括

您现在已经了解了如何探索大型数据集,这是任何数据分析的重要第一步。 只有在我们了解数据的性质(其内容、格式和结构)之后,我们才能找到对其意义进行分析的最佳策略。

在下一章中,我们将继续研究这个 Jupyter notebook,并探索对我们的数据集提出问题的方法。