提交 702320cf 编写于 作者: W wizardforcel

2020-07-14 22:56:58

上级 dd8a584a
......@@ -2,7 +2,7 @@
Python 是一种多范式编程语言,已成为数据科学家进行数据分析,可视化和机器学习的首选语言。
您将首先学习如何为 Python 建立正确的数据分析环境。 在这里,您将学习安装正确的 Python 发行版,以及使用 Jupyter 笔记本和建立数据库。 之后,您将深入研究 Python 的 NumPy 软件包 -- Python 的强大扩展以及高级数学功能。 您将学习如何创建 NumPy 数组,以及如何使用不同的数组方法和函数。 然后,您将探索 Python 的 pandas 扩展,在那里您将学习数据的子集,并深入研究使用 pandas 的数据映射。 您还将学习通过对数据集进行排序和排序来管理它们。
您将首先学习如何为 Python 建立正确的数据分析环境。 在这里,您将学习安装正确的 Python 发行版,以及使用 Jupyter 笔记本和建立数据库。 之后,您将深入研究 Python 的 NumPy 软件包 -- Python 的强大扩展以及高级数学函数。 您将学习如何创建 NumPy 数组,以及如何使用不同的数组方法和函数。 然后,您将探索 Python 的 pandas 扩展,在那里您将学习数据的子集,并深入研究使用 pandas 的数据映射。 您还将学习通过对数据集进行排序和排序来管理它们。
到本书结尾,您将学习对数据进行索引和分组以进行复杂的数据分析和处理。
......
......@@ -42,7 +42,7 @@ Linux 安装必须通过命令行完成,但是对于那些熟悉 Linux 安装
在本节中,我们将探索 Jupyter 笔记本,这是我们将使用 Python 进行数据分析的主要工具。 我们将看到什么是 Jupyter 笔记本,还将讨论 Markdown,这是我们在 Jupyter 笔记本中用于创建格式化文本的工具。 在 Jupyter 笔记本中,有两种类型的块。 有一些可执行的 Python 代码块,然后是带格式的,人类可读的文本块。
用户执行 Python 代码块,然后将结果直接插入文档中。 除非以同样的方式运行,否则代码块可以以任何顺序重新运行,而不必影响以后的块。 由于 Jupyter 笔记本基于 IPython,因此有一些附加功能,例如魔术功能
用户执行 Python 代码块,然后将结果直接插入文档中。 除非以同样的方式运行,否则代码块可以以任何顺序重新运行,而不必影响以后的块。 由于 Jupyter 笔记本基于 IPython,因此有一些附加功能,例如魔术命令
Anaconda 随附 Jupyter 笔记本。 Jupyter 笔记本允许纯文本与代码混合。 可以使用称为 **Markdown** 的语言格式化纯文本。 它以纯文本格式完成。 我们也可以插入段落。 以下示例是您在 Markdown 中看到的一些常见语法:
......@@ -82,39 +82,39 @@ Anaconda 随附 Jupyter 笔记本。 Jupyter 笔记本允许纯文本与代码
![](img/2565c2e6-345d-4b1e-a1c2-7d3f5c795ea6.png)
我们也可以导入库。 例如,我们可以从 Matplotlib 导入模块。 在这种情况下,为了使 Matplotlib 在 Jupyter 笔记本中交互工作,我们将需要使用魔术函数,该魔术函数以%开头,魔术函数的名称以及需要传递给的任何类型的参数。 它。 稍后,我们将在详细信息中介绍这些内容,但首先让我们运行该单元格。`plt`现在已经加载,现在我们可以使用它了。 例如,在最后一个单元格中,我们将输入以下代码:
我们也可以导入库。 例如,我们可以从 Matplotlib 导入模块。 在这种情况下,为了使 Matplotlib 在 Jupyter 笔记本中交互工作,我们将需要使用魔术命令,该魔术命令以%开头,魔术命令的名称以及需要传递给的任何类型的参数。 它。 稍后,我们将在详细信息中介绍这些内容,但首先让我们运行该单元格。`plt`现在已经加载,现在我们可以使用它了。 例如,在最后一个单元格中,我们将输入以下代码:
![](img/cd197191-9798-46d6-9448-bed5424046a6.png)
请注意,此单元格的输出直接插入到文档中。 我们可以立即 看到创建的图。 回到魔术函数,这不是我们唯一可用的函数。 让我们看看其他功能
请注意,此单元格的输出直接插入到文档中。 我们可以立即 看到创建的图。 回到魔术命令,这不是我们唯一可用的命令。 让我们看看其他命令
* 魔术功能`magic`将打印有关魔术系统的信息,如以下屏幕截图所示:
* 魔术命令`magic`将打印有关魔术系统的信息,如以下屏幕截图所示:
![](img/0f3e2361-f268-4a4c-906f-a07c8abfb37e.png)
魔术命令的输出
* 另一个有用的功能`timeit`,我们可以使用它来分析代码。 我们首先输入`timeit`,然后输入我们希望分析的代码,如下所示:
* 另一个有用的命令`timeit`,我们可以使用它来分析代码。 我们首先输入`timeit`,然后输入我们希望分析的代码,如下所示:
![](img/7568717e-d006-4017-9604-acd103872739.png)
* 魔术函数`pwd`可用于查看工作目录是什么,如下所示:
* 魔术命令`pwd`可用于查看工作目录是什么,如下所示:
![](img/40e2e58c-e439-408c-9599-ecddba61f8b8.png)
* 魔术函数`cd`可用于更改工作目录,如下所示:
* 魔术命令`cd`可用于更改工作目录,如下所示:
![](img/17797748-fa2f-487f-b02c-d0059a261bf1.png)
* 如果我们希望以交互模式启动 Matplotlib 和 NumPy,魔术函数`pylab`很有用,如下所示:
* 如果我们希望以交互模式启动 Matplotlib 和 NumPy,魔术命令`pylab`很有用,如下所示:
![](img/4c06dc29-3b70-487d-9d98-7e13353944c9.png)
如果希望查看可用魔术功能的列表,可以键入`lsmagic`,如下所示:
如果希望查看可用魔术命令的列表,可以键入`lsmagic`,如下所示:
![](img/e34823c6-6be8-4696-bc06-5e54f9cff9d1.png)
如果需要快速参考表,可以使用魔术函数`quickref`,如下所示:
如果需要快速参考表,可以使用魔术命令`quickref`,如下所示:
![](img/29c90042-1537-4075-88dd-edec313c9025.png)
......
......@@ -52,7 +52,7 @@
除了`dtype`对象之外,NumPy 还引入了特殊的数值:`nan``inf`。 这些可以在数学计算中出现。 **不是数字**`NaN`)。 它表明应为数字的值实际上不是数学定义的。 例如,`0/0`产生`nan`。 有时`nan`也用于表示缺少的信息; 例如,Pandas 就用这个。`inf`表示任意大的数量,因此在实践中,它表示比计算机可以想象的任何数量大的数量。 还定义了`-inf`,它的意思是任意小。 如果数字运算爆炸,即迅速增长而没有边界,则可能会发生这种情况。
从未等于`nan`; 没有定义的事物等于其他事物是没有意义的。 您需要使用 NumPy 函数`isnan`来识别`nan`。 尽管`==`符号不适用于`nan`,但适用于`inf`。 就是说,最好还是使用函数有限或`inf`来区分有限值和无限值。 定义了涉及`nan``inf`的算法,但请注意,它可能无法满足您的需求。 定义了一些特殊功能,以帮助避免出现`nan``inf`时出现的问题。 例如,`nansum` 在忽略`nan`的同时计算可迭代对象的总和。 您可以在 NumPy 文档中找到此类功能的完整列表。 使用它们时,我只会提及它们。
从未等于`nan`; 没有定义的事物等于其他事物是没有意义的。 您需要使用 NumPy 函数`isnan`来识别`nan`。 尽管`==`符号不适用于`nan`,但适用于`inf`。 就是说,最好还是使用函数有限或`inf`来区分有限值和无限值。 定义了涉及`nan``inf`的算法,但请注意,它可能无法满足您的需求。 定义了一些特殊函数,以帮助避免出现`nan``inf`时出现的问题。 例如,`nansum` 在忽略`nan`的同时计算可迭代对象的总和。 您可以在 NumPy 文档中找到此类函数的完整列表。 使用它们时,我只会提及它们。
现在让我们来看一个例子:
......@@ -96,9 +96,9 @@
## 创建 NumPy 数组
现在,我们已经讨论了 NumPy 数据类型,并简要介绍了 NumPy 数组,下面让我们讨论如何创建 NumPy 数组。 在本节中,我们将使用各种函数创建 NumPy 数组。 有一些函数可以创建所谓的空`ndarray`; 用于创建`ndarray`的函数,其中填充了 0、1 或随机数; 以及使用数据创建`ndarray`功能。 我们将讨论所有这些,以及从磁盘保存和加载 NumPy 数组。 有几种创建数组的方法。 一种方法是使用数组函数,在此我们提供一个可迭代的对象或一个可迭代的对象列表,从中将生成一个数组。
现在,我们已经讨论了 NumPy 数据类型,并简要介绍了 NumPy 数组,下面让我们讨论如何创建 NumPy 数组。 在本节中,我们将使用各种函数创建 NumPy 数组。 有一些函数可以创建所谓的空`ndarray`; 用于创建`ndarray`的函数,其中填充了 0、1 或随机数; 以及使用数据创建`ndarray`函数。 我们将讨论所有这些,以及从磁盘保存和加载 NumPy 数组。 有几种创建数组的方法。 一种方法是使用数组函数,在此我们提供一个可迭代的对象或一个可迭代的对象列表,从中将生成一个数组。
我们将使用列表列表来执行此操作,但是这些列表可以是元组,元组的元组甚至其他数组的列表。 还有一些方法可以自动创建充满数据的数组。 例如,我们可以使用诸如`ones``zeros``randn`之类的功能; 后者填充了随机生成的数据。 这些数组需要传递一个元组,该元组确定数组的形状,即数组具有多少维以及每个维的长度。 每个创建的数组都被认为是空的,不包含任何感兴趣的数据。 这通常是垃圾数据,由创建数组的内存位置中的任何位组成。
我们将使用列表列表来执行此操作,但是这些列表可以是元组,元组的元组甚至其他数组的列表。 还有一些方法可以自动创建充满数据的数组。 例如,我们可以使用诸如`ones``zeros``randn`之类的函数; 后者填充了随机生成的数据。 这些数组需要传递一个元组,该元组确定数组的形状,即数组具有多少维以及每个维的长度。 每个创建的数组都被认为是空的,不包含任何感兴趣的数据。 这通常是垃圾数据,由创建数组的内存位置中的任何位组成。
我们可以根据需要指定`dtype`参数,但如果不指定,则可以猜测`dtype`或浮点数。 请注意下表中的最后一行:
......@@ -182,7 +182,7 @@
![](img/d8ce83f0-5dbf-4559-9d09-05239a22de01.png)
建议您使用`save``savez``savetxt`功能。 我已经在上表中显示了这些函数的通用语法。 在`savetxt`的情况下,如果要用逗号分隔的文件,只需将定界符参数设置为逗号字符。 另外,如果文件名以`.gz`结尾,则`savetxt`可以保存压缩的文本文件,从而节省了步骤,因为您以后无需自己压缩文本文件。 请注意,除非您编写完整的文件路径,否则指定的文件将保存在工作目录中。
建议您使用`save``savez``savetxt`函数。 我已经在上表中显示了这些函数的通用语法。 在`savetxt`的情况下,如果要用逗号分隔的文件,只需将定界符参数设置为逗号字符。 另外,如果文件名以`.gz`结尾,则`savetxt`可以保存压缩的文本文件,从而节省了步骤,因为您以后无需自己压缩文本文件。 请注意,除非您编写完整的文件路径,否则指定的文件将保存在工作目录中。
让我们看看我们如何能够保存一些数组。 我们可能应该做的第一件事是检查工作目录是什么:
......@@ -202,7 +202,7 @@
![](img/de072811-9bef-4e59-8ad2-ef193f5fe1c0.png)
我们还可以创建一个在`mat1`中包含相同信息的 CSV 文件。 例如,我们可以使用以下功能保存它:
我们还可以创建一个在`mat1`中包含相同信息的 CSV 文件。 例如,我们可以使用以下函数保存它:
![](img/432da793-afdb-4fc1-8d9c-c36e0c990774.png)
......@@ -214,11 +214,11 @@
![](img/92e6a7fc-a97e-4011-ac75-8e2f08d2fe3e.png)
现在,很明显,如果我们可以保存`ndarray`,那么我们也应该能够加载它们。 以下是一些用于加载`ndarray`的常用功能
现在,很明显,如果我们可以保存`ndarray`,那么我们也应该能够加载它们。 以下是一些用于加载`ndarray`的常用函数
![](img/b74f654c-d2dd-4144-9fa4-d91ae823639a.png)
这些功能与用于保存`ndarray`的功能紧密一致。 您将需要在 Python 中保存生成的`ndarray`。 如果要从文本文件加载,请注意,不必为创建`ndarray`而由 NumPy 创建数组。 如果您保存到 CSV,则可以使用文本编辑器或 Excel 创建 NumPy `ndarray`。 然后,您可以将它们加载到 Python 中。 我假设您正在加载的文件中的数据适合`ndarray`; 也就是说,它具有正方形格式,并且仅由一种类型的数据组成,因此不包含字符串和数字。
这些函数与用于保存`ndarray`的函数紧密一致。 您将需要在 Python 中保存生成的`ndarray`。 如果要从文本文件加载,请注意,不必为创建`ndarray`而由 NumPy 创建数组。 如果您保存到 CSV,则可以使用文本编辑器或 Excel 创建 NumPy `ndarray`。 然后,您可以将它们加载到 Python 中。 我假设您正在加载的文件中的数据适合`ndarray`; 也就是说,它具有正方形格式,并且仅由一种类型的数据组成,因此不包含字符串和数字。
可以通过`ndarray`处理多类型的数据,但是此时您应该使用 pandas 数据帧,我们将在后面的部分中进行讨论。 因此,如果我想加载刚刚创建的文件的内容,可以使用`loadtxt`函数进行加载,结果如下:
......
......@@ -132,7 +132,7 @@
## 扩展数组
连接功能允许使用屏幕上显示的语法沿公共轴将数组绑定在一起。 该方法要求数组沿未用于绑定的轴具有相似的形状。 结果就是全新的`ndarray`,这是将数组粘合在一起的产物。 为此,还存在其他类似功能,例如堆栈。 我们不会涵盖所有内容。
连接函数允许使用屏幕上显示的语法沿公共轴将数组绑定在一起。 该方法要求数组沿未用于绑定的轴具有相似的形状。 结果就是全新的`ndarray`,这是将数组粘合在一起的产物。 为此,还存在其他类似函数,例如堆栈。 我们不会涵盖所有内容。
假设我们想向`arr2`添加更多行。 使用以下代码执行此操作:
......@@ -212,7 +212,7 @@ NumPy 数组的算术总是按组件进行的。 这意味着,如果我们有
## 线性代数
请注意,NumPy 是为支持线性代数而构建的。 一维 NumPy 数组可以对应于线性代数向量; 矩阵的二维数组; 和 3D,4D 或所有`ndarray`到张量。 因此,在适当的时候,NumPy 支持线性代数运算,例如数组的矩阵乘积,转置,矩阵求逆等。`linalg`模块支持大多数 NumPy 线性代数功能。 以下是常用的 NumPy 线性代数函数的列表:
请注意,NumPy 是为支持线性代数而构建的。 一维 NumPy 数组可以对应于线性代数向量; 矩阵的二维数组; 和 3D,4D 或所有`ndarray`到张量。 因此,在适当的时候,NumPy 支持线性代数运算,例如数组的矩阵乘积,转置,矩阵求逆等。`linalg`模块支持大多数 NumPy 线性代数函数。 以下是常用的 NumPy 线性代数函数的列表:
![](img/947424be-4f60-4dc5-ab46-b64a30b26289.png)
......@@ -238,7 +238,7 @@ NumPy 数组的算术总是按组件进行的。 这意味着,如果我们有
您可以通过查看此数组的逻辑方式来猜测。
现在让我们看一些更复杂的线性代数功能。 让我们从 Sklearn 库的数据集模块中加载一个名为`load_iris`的函数,以便我们可以查看经典的鸢尾花数据集:
现在让我们看一些更复杂的线性代数函数。 让我们从 Sklearn 库的数据集模块中加载一个名为`load_iris`的函数,以便我们可以查看经典的鸢尾花数据集:
![](img/97bf54b1-56e6-4936-9afa-b1bf10da93a9.png)
......@@ -282,11 +282,11 @@ NumPy 数组的算术总是按组件进行的。 这意味着,如果我们有
## 使用数组方法和函数
现在,我们将讨论 NumPy 数组方法和函数的使用。 在本节中,我们将研究常见的`ndarray`函数和方法。 这些功能使您可以使用简洁,直观的语法执行常规任务,而不仅仅是 Python 代码的概念。
现在,我们将讨论 NumPy 数组方法和函数的使用。 在本节中,我们将研究常见的`ndarray`函数和方法。 这些函数使您可以使用简洁,直观的语法执行常规任务,而不仅仅是 Python 代码的概念。
## 数组方法
NumPy `ndarray`函数包含一些有助于完成常见任务的方法,例如查找数据集的均值或多个数据集的多个均值。 我们可以对数组的行和列进行排序,找到数学和统计量,等等。 有很多功能可以完成很多事情! 我不会全部列出。 在下面,我们看到了常见管理任务所需的功能,例如将数组解释为列表或对数组内容进行排序:
NumPy `ndarray`函数包含一些有助于完成常见任务的方法,例如查找数据集的均值或多个数据集的多个均值。 我们可以对数组的行和列进行排序,找到数学和统计量,等等。 有很多函数可以完成很多事情! 我不会全部列出。 在下面,我们看到了常见管理任务所需的函数,例如将数组解释为列表或对数组内容进行排序:
![](img/fcedd7e4-37bf-4748-811c-80ffbfad1457.png)
......@@ -339,7 +339,7 @@ NumPy `ndarray`函数包含一些有助于完成常见任务的方法,例如
## `ufuncs`的向量化
`ufunc`是专门用于数组的 NumPy 函数; 特别地,它们支持向量化。 向量化函数按组件方式应用于数组的元素。 这些通常是高度优化的功能,可以在较快的语言(例如 C)的后台运行。
`ufunc`是专门用于数组的 NumPy 函数; 特别地,它们支持向量化。 向量化函数按组件方式应用于数组的元素。 这些通常是高度优化的函数,可以在较快的语言(例如 C)的后台运行。
在下面,我们看到一些常见的`ufuncs`,其中许多是数学上的:
......@@ -359,23 +359,23 @@ NumPy `ndarray`函数包含一些有助于完成常见任务的方法,例如
## 自定义函数
如前所述,我们可以创建自己的`ufuncs`。 创建`ufuncs`的一种方法是使用现有的`ufuncs`,向量化操作,数组方法等(即 Numpy 的所有现有基础结构)来创建一个函数,该函数逐个组件地生成我们想要的结果。 假设由于某些原因我们不想这样做。 如果我们有一个现有的 Python 函数,而只想对该函数进行向量化处理,以便将其应用于`ndarray`组件,则可以使用 NumPy 的`vectorize`函数创建该函数的新向量化版本。 `vectorize`功能作为输入,并将功能的向量化版本作为输出。
如前所述,我们可以创建自己的`ufuncs`。 创建`ufuncs`的一种方法是使用现有的`ufuncs`,向量化操作,数组方法等(即 Numpy 的所有现有基础结构)来创建一个函数,该函数逐个组件地生成我们想要的结果。 假设由于某些原因我们不想这样做。 如果我们有一个现有的 Python 函数,而只想对该函数进行向量化处理,以便将其应用于`ndarray`组件,则可以使用 NumPy 的`vectorize`函数创建该函数的新向量化版本。 `vectorize`函数作为输入,并将函数的向量化版本作为输出。
如果您不关心速度,可以使用`vectorize`,但是`vectorize`创建的功能不一定很快。 实际上,前一种方法(使用 NumPy 的现有功能和基础结构来创建您的向量化功能)可将`ufuncs`的生成速度提高许多倍。
如果您不关心速度,可以使用`vectorize`,但是`vectorize`创建的函数不一定很快。 实际上,前一种方法(使用 NumPy 的现有函数和基础结构来创建您的向量化函数)可将`ufuncs`的生成速度提高许多倍。
我们要做的第一件事是定义一个适用于单个标量值的函数。 它的作用是截断,因此如果一个数字小于零,则该数字将替换为零:
![](img/3ff39dbc-d824-4de3-8b8b-faf4e2a98576.png)
功能未向量化; 让我们尝试将此函数应用于矩阵`arr1`
函数未向量化; 让我们尝试将此函数应用于矩阵`arr1`
![](img/04f9f215-dec1-4240-abf7-8eb57454d11e.png)
然后,我们希望该矩阵中每个错误的数量都改为零。 但是,当我们尝试应用此功能时,它根本不起作用:
然后,我们希望该矩阵中每个错误的数量都改为零。 但是,当我们尝试应用此函数时,它根本不起作用:
![](img/6cc5d3ea-e108-4b80-84b6-60cc1a24d15f.png)
我们需要做的是创建一个`ufunc`,其功能与原始功能相同。 因此,我们使用 vectorize 并可以创建可以按预期工作的向量化版本,但效率不高:
我们需要做的是创建一个`ufunc`,其函数与原始函数相同。 因此,我们使用 vectorize 并可以创建可以按预期工作的向量化版本,但效率不高:
![](img/bcddac11-fa34-4ee4-b31b-c01e539951bc.png)
......@@ -391,7 +391,7 @@ NumPy `ndarray`函数包含一些有助于完成常见任务的方法,例如
![](img/359ff8e0-9562-4334-a16a-10c1e7f6a1d1.png)
请注意,第一个功能比手动创建的第二个功能要慢得多。 实际上,它慢了将近 10 倍。
请注意,第一个函数比手动创建的第二个函数要慢得多。 实际上,它慢了将近 10 倍。
## 总结
......
......@@ -160,7 +160,7 @@ pandas 向 Python 引入了两个关键对象,序列和数据帧,后者可
## 新增数据
创建系列或数据帧之后,我们可以使用`concat`函数或`append`方法向其中添加更多数据。 我们将一个对象传递给包含将添加到现有对象中的数据的方法。 如果我们正在使用数据帧,则可以附加新行或新列。 我们可以使用`concat`函数添加新列,并使用`dict`,系列或数据帧进行串联
创建系列或数据帧之后,我们可以使用`concat`函数或`append`方法向其中添加更多数据。 我们将一个对象传递给包含将添加到现有对象中的数据的方法。 如果我们正在使用数据帧,则可以附加新行或新列。 我们可以使用`concat`函数添加新列,并使用`dict`,系列或数据帧进行连接
让我们看看如何将新信息添加到系列或数据帧中。 例如,让我们在`pops`系列中添加两个新城市,分别是`Seattle``Denver`。 结果如下:
......@@ -228,7 +228,7 @@ Pandas 提供的方法可以使我们清楚地说明我们要如何编制索引
## 切片数据帧
在讨论切片系列之后,让我们谈谈切片数据帧。 好消息是,在谈论系列切片时,许多艰苦的工作已经完成。 我们介绍了`loc``iloc`作为串联方法,但它们也是数据帧方法。 毕竟,您应该考虑将数据帧视为多个列粘合在一起的系列。
在讨论切片系列之后,让我们谈谈切片数据帧。 好消息是,在谈论系列切片时,许多艰苦的工作已经完成。 我们介绍了`loc``iloc`作为连接方法,但它们也是数据帧方法。 毕竟,您应该考虑将数据帧视为多个列粘合在一起的系列。
现在,我们需要考虑从系列中学到的知识如何转换为二维设置。 如果我们使用括号表示法,它将仅适用于数据帧的列。 我们将需要使用`loc``iloc`来对数据帧的行进行子集化。 实际上,这些方法可以接受两个位置参数。 根据我们前面描述的规则,第一个位置参数确定要选择的行,第二个位置参数确定要选择的列。 可以发出第二个参数来选择所有列,并将选择规则仅应用于行。 这意味着我们应该将第一个参数作为冒号,以便在我们选择的列中更加挑剔。
......
......@@ -64,7 +64,7 @@
![](img/3fa02489-e851-43ae-8a6c-3f9d4440aca9.png)
现在,让我们谈谈功能应用和映射。 这类似于我们之前定义的截断函数。 我正在使用`lambda`表达式创建一个临时函数,然后将该临时函数应用于`srs1`的每个元素,如下所示:
现在,让我们谈谈函数应用和映射。 这类似于我们之前定义的截断函数。 我正在使用`lambda`表达式创建一个临时函数,然后将该临时函数应用于`srs1`的每个元素,如下所示:
![](img/4ab5fcba-1a5b-4fc6-92fb-f0c3d827aa87.png)
......@@ -76,7 +76,7 @@
![](img/8b1383d6-61e6-469b-b2ba-9120749a47b9.png)
这也适用于功能,例如应用方式。
这也适用于函数,例如应用方式。
## 数据帧的算术
......@@ -88,7 +88,7 @@
## 数据帧的函数应用
毫不奇怪,数据帧提供了函数应用的方法。 您应注意两种方法:`apply``applymap``apply`带有一个函数,默认情况下,将该函数应用于与数据帧的每一列相对应的序列。 产生的内容取决于函数的功能。 我们可以更改`apply``axis`参数,以便将其应用于行(即跨列),而不是应用于列(即跨行)。`applymap`具有与应用不同的目的。 鉴于`apply`求值每一列上提供的功能,因此应准备进行一系列研究,而`applymap`将分别求值数据帧的每个元素上的`pass`功能
毫不奇怪,数据帧提供了函数应用的方法。 您应注意两种方法:`apply``applymap``apply`带有一个函数,默认情况下,将该函数应用于与数据帧的每一列相对应的序列。 产生的内容取决于函数的功能。 我们可以更改`apply``axis`参数,以便将其应用于行(即跨列),而不是应用于列(即跨行)。`applymap`具有与应用不同的目的。 鉴于`apply`在每一列上求值提供的函数,因此应准备进行一系列研究,而`applymap`将分别求值数据帧的每个元素上的`pass`函数
我们可以使用`apply`函数来获取所需的数量,但是使用数据帧提供的现有方法通常更有用,并且也许更快。
......@@ -170,7 +170,7 @@
![](img/6f31c997-41ea-4863-bbea-39fc8e9fb8a3.png)
`notnull`功能基本上与`isnull`功能完全相反; 缺少数据时返回`false`,不丢失数据时返回`true`,如下所示:
`notnull`函数基本上与`isnull`函数完全相反; 缺少数据时返回`false`,不丢失数据时返回`true`,如下所示:
![](img/2696fb61-724d-4539-a2ff-062ff73ea35f.png)
......
......@@ -6,7 +6,7 @@
# 这本书是给谁的
本书适用于希望了解流行的 pandas 库的新兴数据科学家,或希望踏入数据分析领域的 Python 开发人员-如果您属于这两个类别,那么本书是您理想的参考资料 开始吧。
本书适用于希望了解流行的 pandas 库的新兴数据科学家,或希望踏入数据分析领域的 Python 开发人员 -- 如果您属于这两个类别,那么本书是您理想的参考资料。开始吧。
# 本书涵盖的内容
......
......@@ -307,7 +307,7 @@ df = pd.read_excel('IMDB.xlsx', sheetname= 0, na_values=[' '])
# 读取 JSON 文件
JSON 是用于结构化数据的最小可读格式。 它主要用于在服务器和 Web 应用程序之间传输数据,以替代 XML,如以下屏幕快照所示:
JSON 是用于结构化数据的最小可读格式。 它主要用于在服务器和 Web 应用之间传输数据,以替代 XML,如以下屏幕快照所示:
![](img/c67f9d24-a64c-43d4-9f07-d5eccf714d35.png)
......
......@@ -676,14 +676,14 @@ data[['Age', 'Pclass']].applymap(np.square)
我们还将 Numpy 的`secure`方法应用于这两个列。
前面的步骤用于预定义功能。 现在,让我们继续创建自己的函数,然后将其应用于值,如下所示:
前面的步骤用于预定义函数。 现在,让我们继续创建自己的函数,然后将其应用于值,如下所示:
```py
def my_func(i):
return i + 20
```
创建的函数是一个简单的函数,它带有一个值,将`20`添加到其中,然后返回结果。 我们使用`applymap()`将此功能应用于`Age``Pclass`列中的每个值,如下所示:
创建的函数是一个简单的函数,它带有一个值,将`20`添加到其中,然后返回结果。 我们使用`applymap()`将此函数应用于`Age``Pclass`列中的每个值,如下所示:
```py
data[['Age', 'Pclass']].applymap(my_func)
......@@ -691,7 +691,7 @@ data[['Age', 'Pclass']].applymap(my_func)
![](img/dcf93f0e-69c4-49fc-bcc1-65940f91727a.png)
让我们继续学习有关将多个数据帧合并和串联在一起的知识。
让我们继续学习有关将多个数据帧合并和连接在一起的知识。
# 将多个数据帧合并并连接成一个
......@@ -750,7 +750,7 @@ pd.concat([dataset1, dataset2], axis=1)
![](img/cb6c49ea-455d-4c80-b0de-084fb965c0c7.png)
数据集串联的第三个变体是串联具有不同行和列的数据集。 我们首先创建两个具有不同参数的数据集,如下所示:
数据集连接的第三个变体是连接具有不同行和列的数据集。 我们首先创建两个具有不同参数的数据集,如下所示:
```py
dataset1 = pd.DataFrame({'Age': ['32', '26', '29'],
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册