提交 3741a6d3 编写于 作者: W wizardforcel

2020-07-12 16:35:23

上级 bb7412b0
......@@ -26,7 +26,7 @@ Python 之所以成为数据科学首选语言的原因之一是,它是一种
# 本书涵盖的内容
第 1 章,“Pandas 基础”涵盖了用于识别两个主要 Pandas 数据结构(系列和数据)的组成部分的解剖结构和词汇表。 每一列必须仅具有一种数据类型,并且涵盖了每种数据类型。 您将学习如何通过调用和链接它们的方法来释放序列和数据帧的功能。
第 1 章,“Pandas 基础”涵盖了用于识别两个主要 Pandas 数据结构(系列和数据)的组成部分的解剖结构和词汇表。 每一列必须仅具有一种数据类型,并且涵盖了每种数据类型。 您将学习如何通过调用和链接它们的方法来释放序列和数据帧的功能。
第 2 章,“基本数据帧操作”着重介绍您将在数据分析期间执行的最关键和最常见的操作。
......@@ -143,7 +143,7 @@ Tips and tricks appear like this.Warnings or important notes appear in a box lik
# 每个秘籍的假设
应该假设在每个秘籍的开始,都会将 pandas,NumPy 和 matplotlib 导入命名空间。 为了将绘图直接嵌入到笔记本中,还必须运行 magic 命令`%matplotlib inline`。 同样,所有数据都存储在 `data` 目录中,并且最通常存储为 CSV 文件,可以通过`read_csv`功能直接读取。
应该假设在每个秘籍的开始,都会将 pandas,NumPy 和 matplotlib 导入命名空间。 为了将绘图直接嵌入到笔记本中,还必须运行 magic 命令`%matplotlib inline`。 同样,所有数据都存储在 `data` 目录中,并且最通常存储为 CSV 文件,可以通过`read_csv`函数直接读取。
```py
>>> import pandas as pd
......
......@@ -44,7 +44,7 @@ Series 和数据帧的索引组件是将 Pandas 与其他大多数数据分析
# 工作原理
Pandas 首先使用出色且通用的`read_csv`功能将数据从磁盘读入内存,然后读入数据帧。 列和索引的输出均以粗体显示,这使它们易于识别。 按照惯例,术语**索引标签****列名**分别是指索引和列的各个成员。 术语*索引*整体上指所有索引标签,正如术语*列*整体上指所有列名称一样。
Pandas 首先使用出色且通用的`read_csv`函数将数据从磁盘读入内存,然后读入数据帧。 列和索引的输出均以粗体显示,这使它们易于识别。 按照惯例,术语**索引标签****列名**分别是指索引和列的各个成员。 术语*索引*整体上指所有索引标签,正如术语*列*整体上指所有列名称一样。
列和索引用于特定目的,即为数据帧的列和行提供标签。 这些标签允许直接轻松地访问不同的数据子集。 当多个序列或数据帧组合在一起时,索引将在进行任何计算之前首先对齐。 列和索引统称为**轴**
......@@ -62,7 +62,7 @@ The Python standard library contains the `csv` module, which can be used to pars
# 另见
* Pandas`read_csv`功能的官方文档( [http://bit.ly/2vtJQ9A](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)
* Pandas`read_csv`函数的官方文档( [http://bit.ly/2vtJQ9A](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)
# 访问主要的数据帧组件
......
......@@ -216,7 +216,7 @@ dtype: int64
# 另见
* *通过更改数据类型来减少内存第 3 章,*中的*秘籍开始数据分析*
* 第 3 章,“开始数据分析”中的“通过更改数据类型来减少内存”秘籍
# 爆炸指数
......@@ -489,7 +489,7 @@ dtype: float64
![](img/00100.jpeg)
只有两个数据帧中都出现`playerID`的行才会丢失。 类似地,`AB``H``R`列是两个数据帧中唯一出现的列。 即使我们在指定`fill_value`参数的情况下使用`add`方法,我们仍然缺少值。 这是因为在我们的输入数据中从来没有行和列的某些组合。 例如,`playerID` *congeha01* 和列`G`的交集。 他只出现在 2015 年没有`G`列的数据集中。 因此,没有任何值被填充:
只有两个数据帧中都出现`playerID`的行才会丢失。 类似地,`AB``H``R`列是两个数据帧中唯一出现的列。 即使我们在指定`fill_value`参数的情况下使用`add`方法,我们仍然缺少值。 这是因为在我们的输入数据中从来没有行和列的某些组合。 例如,`playerID congeha01`和列`G`的交集。 他只出现在 2015 年没有`G`列的数据集中。 因此,没有任何值被填充:
```py
>>> df_14.add(df_15, fill_value=0).head(10) \
......@@ -596,7 +596,7 @@ Name: MAX_SALARY2, dtype: int64
# 另见
* *从[的最小](../Text/ch03.html#4B7I40-5686c430c0a9442a82c4c5795c8553c9)*秘籍中选择最大的秘籍,“开始数据分析”
* 第 3 章“开始数据分析”中的“从最大的中选择最小的”秘籍
# 突出显示每一列的最大值
......@@ -767,7 +767,7 @@ array(['California Institute of Technology',
# 另见
* Pandas 关于数据框*样式*的官方文档( [http://bit.ly/2hsZkVK](https://pandas.pydata.org/pandas-docs/stable/style.html)
* Pandas 数据帧*样式*的官方文档( [http://bit.ly/2hsZkVK](https://pandas.pydata.org/pandas-docs/stable/style.html)
# 使用方法链接复制 idxmax
......@@ -939,7 +939,7 @@ True
# 寻找最常见的最大值
大学数据集包含超过 7,500 所大学的 8 个不同种族的本科人口百分比。 找到每所学校本科生人数最多的种族,然后为整个数据集找到此结果的分布将是很有趣的。 我们将能够回答一个类似*的问题,哪个机构的白人学生比其他任何种族都要多?*
大学数据集包含超过 7,500 所大学的 8 个不同种族的本科人口百分比。 找到每所学校本科生人数最多的种族,然后为整个数据集找到此结果的分布将是很有趣的。 我们将能够回答一个类似“哪个机构的白人学生比其他任何种族都要多”的问题。
# 准备
......
......@@ -328,11 +328,11 @@ Name: UGDS, dtype: float64
不存在预定义的 Pandas 函数来计算偏离均值的最大标准偏差数。 我们被迫在步骤 2 中构造一个自定义函数。请注意,此自定义函数`max_deviation`接受单个参数`s`。 展望第 3 步,您会注意到函数名称位于`agg`方法内,而没有直接调用。 参数 `s` 没有明确传递给 `max_deviation` 的地方。 相反,Pandas 将, `UGDS` 列 作为系列隐式传递给 `max_deviation`
每个组都会调用一次`max_deviation`功能。 由于`s`是系列,因此所有常规的序列方法均可用。 在称为**标准化**的过程中,从组中的每个值中减去该特定组的平均值,然后再除以标准差。
每个组都会调用一次`max_deviation`函数。 由于`s`是系列,因此所有常规的序列方法均可用。 在称为**标准化**的过程中,从组中的每个值中减去该特定组的平均值,然后再除以标准差。
Standardization is a common statistical procedure to understand how greatly individual values vary from the mean. For a normal distribution, 99.7% of the data lies within three standard deviations of the mean.
由于我们对均值的绝对偏差感兴趣,因此我们从所有标准化得分中获取绝对值并返回最大值。 `agg`方法必须从我们的自定义函数中返回单个标量值,否则将引发异常。 Pandas 默认使用样本标准偏差,该样本标准偏差对于只有单个值的任何组均未定义。 例如,州缩写 *AS* (美属萨摩亚)返回了缺失值,因为它在数据集中只有一个机构。
由于我们对均值的绝对偏差感兴趣,因此我们从所有标准化得分中获取绝对值并返回最大值。 `agg`方法必须从我们的自定义函数中返回单个标量值,否则将引发异常。 Pandas 默认使用样本标准偏差,该样本标准偏差对于只有单个值的任何组均未定义。 例如,州缩写`AS`(美属萨摩亚)返回了缺失值,因为它在数据集中只有一个机构。
# 更多
......@@ -492,14 +492,14 @@ Pandas 无法理解需要将额外的参数传递给`pct_between`。 为了将
![](img/00126.jpeg)
`make_agg_func`功能充当创建自定义聚合功能的工厂。 它接受您已经构建的自定义聚合函数(在这种情况下为`pct_between`),`name`参数以及任意数量的额外参数。 它返回一个已经设置了额外参数的函数。 例如,`my_agg1`是一个特定的定制汇总功能,可以找到大学人口在一千到三千之间的学校所占的百分比。 额外的参数( `*args``**kwargs` )为您的自定义函数( `pct_between` )指定了一组精确的参数 )。 `name`参数非常重要,每次调用 `make_agg_func` 时必须唯一。 它将最终用于重命名聚合列。
`make_agg_func`函数充当创建自定义聚合功能的工厂。 它接受您已经构建的自定义聚合函数(在这种情况下为`pct_between`),`name`参数以及任意数量的额外参数。 它返回一个已经设置了额外参数的函数。 例如,`my_agg1`是一个特定的定制汇总功能,可以找到大学人口在一千到三千之间的学校所占的百分比。 额外的参数( `*args``**kwargs` )为您的自定义函数( `pct_between` )指定了一组精确的参数 )。 `name`参数非常重要,每次调用 `make_agg_func` 时必须唯一。 它将最终用于重命名聚合列。
A closure is a function that contains a function inside of it (a nested function) and returns this nested function. This nested function must refer to variables in the scope of the outer function in order to be a closure. In this example, `make_agg_func` is the outer function and returns the nested function `wrapper`, which accesses the variables `func`, `args`, and `kwargs` from the outer function.
# 另见
* *任意论点列表*,来自官方 Python 文档( [http://bit.ly/2vumbTE](https://docs.python.org/3/tutorial/controlflow.html#arbitrary-argument-lists)
* 关于 *Python 闭包*[http://bit.ly/2xFdYga](http://www.geeksforgeeks.org/python-closures/) )的教程
* *任意参数列表*,来自官方 Python 文档( [http://bit.ly/2vumbTE](https://docs.python.org/3/tutorial/controlflow.html#arbitrary-argument-lists)
* *Python 闭包的教程*[http://bit.ly/2xFdYga](http://www.geeksforgeeks.org/python-closures/)
# 检查 groupby 对象
......@@ -520,7 +520,7 @@ A closure is a function that contains a function inside of it (a nested function
pandas.core.groupby.DataFrameGroupBy
```
2. 使用`dir`功能发现其所有可用功能:
2. 使用`dir`函数发现其所有可用功能:
```py
>>> print([attr for attr in dir(grouped) if not attr.startswith('_')])
......@@ -575,7 +575,7 @@ pandas.core.groupby.DataFrameGroupBy
很少需要遍历整个组,通常,如果有必要,应避免这样做,因为这样做可能会很慢。 有时候,您别无选择。 当通过对象遍历 group 时,将为您提供一个元组,其中包含组名和数据帧,而没有分组列。 在步骤 6 中,此元组在 for 循环中解包为变量`name``group`
在遍历组时可以做的一件有趣的事情是直接在笔记本中显示每个组的几行。 为此,可以使用`IPython.display`模块中的打印功能或`display`功能。 使用`print`函数可得到纯文本格式的数据帧,而没有任何不错的 HTML 格式。 使用`display`功能将以其常规的易于阅读的格式生成数据帧。
在遍历组时可以做的一件有趣的事情是直接在笔记本中显示每个组的几行。 为此,可以使用`IPython.display`模块中的打印功能或`display`函数。 使用`print`函数可得到纯文本格式的数据帧,而没有任何不错的 HTML 格式。 使用`display`函数将以其常规的易于阅读的格式生成数据帧。
# 更多
......@@ -680,7 +680,7 @@ This `filter` method applied after a call to the `groupby` method is completely
# 另见
* Pandas 关于*过滤*的官方文档( [http://bit.ly/2xGUoA7](https://pandas.pydata.org/pandas-docs/stable/groupby.html#filtration)
* Pandas *过滤*的官方文档( [http://bit.ly/2xGUoA7](https://pandas.pydata.org/pandas-docs/stable/groupby.html#filtration)
# 通过减肥赌注转型
......@@ -788,19 +788,19 @@ Name: Winner, dtype: int64
# 工作原理
在整个秘籍中,`query`方法用于过滤数据,而不是布尔索引。 有关更多信息*,请参阅第 5 章,“布尔索引”的查询方法*秘籍,以提高布尔索引的可读性。
在整个秘籍中,`query`方法用于过滤数据,而不是布尔索引。 有关更多信息,请参阅第 5 章,“布尔索引”的“查询方法”秘籍,以提高布尔索引的可读性。
我们的目标是找到每个人每个月的减肥百分比。 一种完成此任务的方法是计算相对于每个月初的每周减肥。 此特定任务非常适合`transform` groupby 方法。 `transform`方法接受一项功能作为其必需的参数。 该函数隐式地传递给每个非分组列(或仅使用在索引运算符中指定的列,如在此秘籍中使用`Weight`所做的那样)。 它必须返回与传递的组长度相同的值序列,否则将引发异常。 本质上,原始数据帧中的所有值都在转换。 没有聚集或过滤发生。
第 2 步创建一个函数,该函数从其所有值中减去传递的序列的第一个值,然后将该结果除以第一个值。 这将计算相对于第一个值的百分比损失(或收益)。 在第 3 步中,我们在一个月内对一个人测试了此功能。
在步骤 4 中,我们在人和周的每个组合上以相同的方式使用此功能。 从字面上看,我们正在*将*`Weight`列转换为当前一周的体重损失百分比。 为每个人输出第一个月的数据。 Pandas 将新数据作为系列返回。 该系列本身并没有什么用处,并且更有意义地作为新列附加到原始数据帧中。 我们在步骤 5 中完成此操作。
在步骤 4 中,我们在人和周的每个组合上以相同的方式使用此功能。 从字面上看,我们正在`Weight`列转换为当前一周的体重损失百分比。 为每个人输出第一个月的数据。 Pandas 将新数据作为系列返回。 该系列本身并没有什么用处,并且更有意义地作为新列附加到原始数据帧中。 我们在步骤 5 中完成此操作。
要确定获胜者,只需每月的第 4 周。 我们可以在这里停下来,手动确定获胜者,但 Pandas 提供了自动执行此功能的功能。 第 7 步中的`pivot`函数通过将一列的唯一值转换为新的列名称来重塑我们的数据集。 `index`参数用于您不想旋转的列。 传递给`values`参数的列将平铺在`index``columns`参数中列的每个唯一组合上。
The `pivot` method only works if there is just a single occurrence of each unique combination of the columns in the `index` and `columns` parameters. If there is more than one unique combination, an exception will be raised. You can use the `pivot_table` method in that situation which allows you to aggregate multiple values together.
枢纽化之后,我们利用高效且快速的 NumPy `where`函数,该函数的第一个参数是产生一系列布尔值的条件。 `True`值映射到 *Amy*`False`值映射到 *Bob。* 我们突出显示每个月的获胜者,并使用`value_counts`方法统计最终得分。
枢纽化之后,我们利用高效且快速的 NumPy `where`函数,该函数的第一个参数是产生一系列布尔值的条件。 `True`值映射到`Amy``False`值映射到`Bob`我们突出显示每个月的获胜者,并使用`value_counts`方法统计最终得分。
# 更多
......@@ -825,8 +825,8 @@ array(['Jan', 'Feb', 'Mar', 'Apr'], dtype=object)
# 另见
* 关于`groupby` *转换*的 Pandas 官方文档( [http://bit.ly/2vBkpA7](http://pandas.pydata.org/pandas-docs/stable/groupby.html#transformation)
* 关于`where`功能的 NumPy 官方文档( [http://bit.ly/2weT21l](https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html)
* `groupby`*转换*的 Pandas 官方文档( [http://bit.ly/2vBkpA7](http://pandas.pydata.org/pandas-docs/stable/groupby.html#transformation)
* `where`函数的 NumPy 官方文档( [http://bit.ly/2weT21l](https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html)
# 计算每个州的 SAT 加权平均成绩
......@@ -1006,7 +1006,7 @@ Categories (5, interval[float64]): [(-inf, 200.0] < (200.0, 500.0] < (500.0, 100
Name: DIST, dtype: int64
```
4. `cuts`系列现在可以用于形成组。 Pandas 允许您以任何希望的方式来分组。 将`cuts`系列传递到`groupby`方法,然后在`AIRLINE`列上调用`value_counts`方法以查找每个距离组的分布。 请注意,SkyWest( *OO* )组成了少于 200 英里的航班的 33% ,但仅占 200 到 500 英里之间的航班的 16%
4. `cuts`系列现在可以用于形成组。 Pandas 允许您以任何希望的方式来分组。 将`cuts`系列传递到`groupby`方法,然后在`AIRLINE`列上调用`value_counts`方法以查找每个距离组的分布。 请注意,SkyWest(`OO`)组成了少于 200 英里的航班的 33%,但仅占 200 到 500 英里之间的航班的 16%
```py
>>> flights.groupby(cuts)['AIRLINE'].value_counts(normalize=True) \
......@@ -1066,7 +1066,7 @@ DIST
Name: AIR_TIME, dtype: float64
```
当使用`cut`功能时,我们可以使用此信息来创建内容丰富的字符串标签。 这些标签代替了间隔符号。 我们还可以链接`unstack`方法,该方法将内部索引级别转换为列名称:
当使用`cut`函数时,我们可以使用此信息来创建内容丰富的字符串标签。 这些标签代替了间隔符号。 我们还可以链接`unstack`方法,该方法将内部索引级别转换为列名称:
```py
>>> labels=['Under an Hour', '1 Hour', '1-2 Hours',
......@@ -1082,8 +1082,8 @@ Name: AIR_TIME, dtype: float64
# 另见
* 关于`cut`功能的 Pandas 官方文档( [http://bit.ly/2whcUkJ](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.cut.html)
* 有关 *m* 的更多秘籍,请参考第 8 章, *Re* *将数据整理为整齐的格式*
* `cut`函数的 Pandas 官方文档( [http://bit.ly/2whcUkJ](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.cut.html)
* 更多秘籍请参考第 8 章, “将数据整理为整齐的格式”
# 计算城市之间的航班总数
......@@ -1110,7 +1110,7 @@ ATL ABE 31
dtype: int64
```
2. 选择在两个方向上的休斯顿( *IAH* )和亚特兰大( *ATL* )之间的航班总数:
2. 选择在两个方向上的休斯顿(`IAH`)和亚特兰大(`ATL`)之间的航班总数:
```py
>>> flights_ct.loc[[('ATL', 'IAH'), ('IAH', 'ATL')]]
......@@ -1227,7 +1227,7 @@ NumPy 解决方案的速度比对 Pandas 使用`apply`快 700 倍。
# 另见
* 关于`sort`功能的 NumPy 官方文档( [http://bit.ly/2vtRt0M](https://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html)
* 关于`sort`函数的 NumPy 官方文档( [http://bit.ly/2vtRt0M](https://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html)
# 寻找最长的准时航班
......@@ -1427,5 +1427,5 @@ dtype: float64
# 另见
* 请参阅*与运算符一起使用第 1 章,*Pandas “Pandas 基础”*的系列* 秘籍
* 请参阅第 1 章,“Pandas 基础”的“将运算符与序列一起使用”秘籍
* Pandas `ffill`的官方文档( [http://bit.ly/2gn5zGU](http://bit.ly/2gn5zGU)
\ No newline at end of file
......@@ -54,7 +54,7 @@
![](img/00147.jpeg)
该表似乎没有任何混乱,并且该信息很容易消耗。 但是,按照整洁的原则,它实际上并不是整洁的。 每个列名称实际上是变量的值。 实际上,数据帧中甚至都没有变量名。 将凌乱的数据集转换为整洁的数据的第一步之一就是识别所有变量。 在此特定数据集中,我们具有**状态****水果**的变量。 在问题的背景下,还没有找到任何数字数据。 我们可以将此变量标记为**权重**或其他任何明智的名称。
该表似乎没有任何混乱,并且该信息很容易消耗。 但是,按照整洁的原则,它实际上并不是整洁的。 每个列名称实际上是变量的值。 实际上,数据帧中甚至都没有变量名。 将凌乱的数据集转换为整洁的数据的第一步之一就是识别所有变量。 在此特定数据集中,我们具有******水果**的变量。 在问题的背景下,还没有找到任何数字数据。 我们可以将此变量标记为**权重**或其他任何明智的名称。
# 准备
......@@ -125,7 +125,7 @@ dtype: int64
# 工作原理
`stack`方法功能强大,需要花费一些时间才能完全理解和欣赏。 它接受所有列名并转置它们,因此它们成为新的最里面的索引级别。 请注意,每个旧列名称仍如何通过与每个状态配对来标记其原始值。 3 x 3 数据中有 9 个原始值,这些值被转换为具有相同数量值的单个序列。 原始的第一行数据成为结果系列中的前三个值。
`stack`方法功能强大,需要花费一些时间才能完全理解和欣赏。 它接受所有列名并转置它们,因此它们成为新的最里面的索引级别。 请注意,每个旧列名称仍如何通过与每个状态配对来标记其原始值。 3 x 3 数据中有 9 个原始值,这些值被转换为具有相同数量值的单个序列。 原始的第一行数据成为结果系列中的前三个值。
在步骤 2 中重置索引后,pandas 将我们的数据帧列默认设置为`level_0``level_1``0`。 这是因为调用此方法的序列具有两个未正式命名的索引级别。 Pandas 还从外部从零开始按整数引用索引。
......@@ -269,7 +269,7 @@ It is somewhat common terminology to refer to the transformation of horizontal c
# 准备
在本秘籍中,我们将通过同时堆叠演员名称及其与`wide_to_long`功能相对应的 Facebook 赞来整理`actor` DataFrame。
在本秘籍中,我们将通过同时堆叠演员名称及其与`wide_to_long`函数相对应的 Facebook 赞来整理`actor` DataFrame。
# 操作步骤
......@@ -310,13 +310,13 @@ It is somewhat common terminology to refer to the transformation of horizontal c
# 工作原理
`wide_to_long` 功能以相当特定的方式工作。 它的主要参数是`stubnames`,它是一个字符串列表。 每个字符串代表一个列分组。 以该字符串开头的所有列都将被堆叠到一个列中。 在此秘籍中,有两列列: *actor**actor_facebook_likes* 。 默认情况下,这些列的每个组都需要以数字结尾。 此数字随后将用于标记整形数据。 每个列组都有一个下划线字符,将`stubname`与结尾数字分开。 为此,必须使用`sep`参数。
`wide_to_long` 功能以相当特定的方式工作。 它的主要参数是`stubnames`,它是一个字符串列表。 每个字符串代表一个列分组。 以该字符串开头的所有列都将被堆叠到一个列中。 在此秘籍中,有两列列: `actor``actor_facebook_likes`。 默认情况下,这些列的每个组都需要以数字结尾。 此数字随后将用于标记整形数据。 每个列组都有一个下划线字符,将`stubname`与结尾数字分开。 为此,必须使用`sep`参数。
原始列名称与`wide_to_long`工作所需的模式不匹配。 可以通过使用列表精确指定列名称来手动更改列名称。 这很快就会成为很多类型的输入,因此,我们定义了一个函数,该函数自动将我们的列转换为有效的格式。 `change_col_name` 函数从参与者列中删除 **_ 名称**,并重新排列 Facebook 列,以便现在它们都以数字结尾。
原始列名称与`wide_to_long`工作所需的模式不匹配。 可以通过使用列表精确指定列名称来手动更改列名称。 这很快就会成为很多类型的输入,因此,我们定义了一个函数,该函数自动将我们的列转换为有效的格式。 `change_col_name` 函数从参与者列中删除`_name`,并重新排列 Facebook 列,以便现在它们都以数字结尾。
要实际完成列重命名,我们在步骤 2 中使用`rename`方法。它接受许多不同类型的参数,其中之一是函数。 将其传递给函数时,每个列名都会一次隐式传递给它。
现在,我们已经正确地创建了两个独立的列组,即以 **actor****actor_facebook_likes** 开头的列,它们将被堆叠**。** 除此之外,`wide_to_long`还需要一个唯一列,即参数`i`,用作不会堆叠的标识变量。 还需要参数`j`,该参数仅重命名从原始列名的末尾去除的标识数字。 默认情况下,prefix 参数包含搜索一个或多个数字的**正则表达式****\ d +****\ d** 是与数字 0-9 匹配的特殊令牌。 加号 **+** 使表达式与这些数字中的一个或多个匹配。
现在,我们已经正确地创建了两个独立的列组,即以`actor``actor_facebook_likes`开头的列,它们将被堆叠。 除此之外,`wide_to_long`还需要一个唯一列,即参数`i`,用作不会堆叠的标识变量。 还需要参数`j`,该参数仅重命名从原始列名的末尾去除的标识数字。 默认情况下,prefix 参数包含搜索一个或多个数字的**正则表达式**`\d+``\d`是与数字 0-9 匹配的特殊令牌。 加号`+`使表达式与这些数字中的一个或多个匹配。
To become a powerful user of the `str` methods, you will need to be familiar with regular expressions, which are a sequence of characters that match a particular pattern within some text. They consist of **metacharacters**, which have a special meaning, and **literal** characters. To make yourself useful with regular expressions check this short tutorial from *Regular-Expressions.info* ([http://bit.ly/2wiWPbz](http://bit.ly/2wiWPbz)).
......@@ -463,7 +463,7 @@ True
The result from step 3 isn't quite an exact replication of step 1\. There are entire rows of missing values, and by default, the `stack` method drops these during step 2\. To keep these missing values and create an exact replication, use `dropna=False` in the `stack` method.
步骤 4 读取与步骤 1 相同的数据集,但没有将机构名称放入索引中,因为`melt`方法无法访问它。 步骤 5 使用`melt`方法转置所有 **Race** 列。 它通过将`value_vars`参数保留为其默认值`None`来执行此操作。 如果未指定,则`id_vars`参数中不存在的所有列都将转置。
步骤 4 读取与步骤 1 相同的数据集,但没有将机构名称放入索引中,因为`melt`方法无法访问它。 步骤 5 使用`melt`方法转置所有`Race`列。 它通过将`value_vars`参数保留为其默认值`None`来执行此操作。 如果未指定,则`id_vars`参数中不存在的所有列都将转置。
步骤 6 用`pivot`方法反转了步骤 5 的操作,该方法接受三个参数。 每个参数都将一列作为字符串。 `index`参数引用的列保持垂直并成为新索引。 `columns`参数引用的列的值成为列名。 `values`参数引用的值将平铺以对应于其先前索引和列标签的交集。
......@@ -471,7 +471,7 @@ The result from step 3 isn't quite an exact replication of step 1\. There are en
# 更多
为了帮助进一步理解`stack` / `unstack`,让我们将它们用于**转置** `college` DataFrame
为了帮助进一步理解`stack` / `unstack`,让我们将它们用于**转置**`college`数据帧
In this context, we are using the precise mathematical definition of the transposing of a matrix, where the new rows are the old columns of the original data matrix.
......@@ -492,7 +492,7 @@ In this context, we are using the precise mathematical definition of the transpo
# 另见
* 请参阅*同时选择数据帧行和列[中的](../Text/ch04.html#5DI6C0-5686c430c0a9442a82c4c5795c8553c9)*秘籍第 4 章,“选择数据子集”
* 请参阅第 4 章,“选择数据子集”中的“同时选择数据帧的行和列”秘籍
* Pandas `unstack`[http://bit.ly/2xIyFvr](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.unstack.html) )和`pivot`[http://bit.ly/2f3qAWP](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.pivot.html) )方法的官方文档
# 分组汇总后拆栈
......@@ -576,7 +576,7 @@ Name: BASE_SALARY, dtype: int64
![](img/00168.jpeg)
堆叠**性别**列将产生 MultiIndex 列。 从这里开始,您可以继续使用`unstack``stack`方法交换行和列级别,直到获得所需的数据结构为止:
堆叠`GENDER`列将产生 MultiIndex 列。 从这里开始,您可以继续使用`unstack``stack`方法交换行和列级别,直到获得所需的数据结构为止:
```py
>>> agg2.unstack('GENDER')
......@@ -586,7 +586,7 @@ Name: BASE_SALARY, dtype: int64
# 另见
* 请参阅*分组和多列聚合* 秘籍和来自第 7 章,*分组进行聚集,过滤和转换的功能*
* 请参阅第 7 章,“分组和多列聚合”的“进行聚集,过滤和转换的分组函数”秘籍
# 使用 groupby 聚合复制 ivot_table
......@@ -672,7 +672,7 @@ As of the time of writing this book, there is a bug when unstacking more than on
# 重命名轴级别以方便重塑
当每个轴(索引/列)级别具有名称时,使用`stack` / `unstack`方法进行重塑要容易得多。 Pandas 允许用户按整数位置或名称引用每个轴级别。 由于整数位置是隐式的而不是显式的,因此应尽可能考虑使用级别名称。 此建议来自 *Python 的* *Zen*[http://bit.ly/2xE83uC](http://bit.ly/2xE83uC) ),这是 Python 的指导原则的简短列表,第二个 一个是*显式优于隐式*
当每个轴(索引/列)级别具有名称时,使用`stack` / `unstack`方法进行重塑要容易得多。 Pandas 允许用户按整数位置或名称引用每个轴级别。 由于整数位置是隐式的而不是显式的,因此应尽可能考虑使用级别名称。 此建议来自“Python 之禅”( [http://bit.ly/2xE83uC](http://bit.ly/2xE83uC) ),这是 Python 的指导原则的简短列表,一个是“显式优于隐式”
# 准备
......@@ -834,7 +834,7 @@ dtype: float64
![](img/00183.jpeg)
6. 使用`pd.concat`函数将此数据`wl_melt`串联在一起,以生成整洁的数据集:
6. 使用`pd.concat`函数将此数据`wl_melt`串联在一起,以生成整洁的数据集:
```py
>>> wl_cat_total = wl_melt[['Weight Category', 'Qual Total']]
......@@ -882,7 +882,7 @@ True
# 另见
* 有关非捕获组的更多信息,请参见网站 *Regular-Expressions.info*[http://bit.ly/2f60KSd](http://www.regular-expressions.info/brackets.html)
* 有关非捕获组的更多信息,请参见网站 [Regular-Expressions.info](http://www.regular-expressions.info/brackets.html)
# 将多个变量存储为列值时进行整理
......@@ -1128,7 +1128,7 @@ dtype: object
一旦在步骤 1 中确定了变量,就可以开始重组。 Pandas 没有同时旋转,列的方法,因此我们必须一次完成这一任务。 我们通过将`Property`列传递给`melt`方法中的`id_vars`参数来保持年份垂直。
现在,结果就是在前面的秘籍*中将多个变量存储为列值时进行整理的混乱数据的模式。**所述,该秘籍还有*部分,当在`index`参数中使用多个列时,我们必须使用`pivot_table`来旋转数据帧。 旋转后,`Group``Year`变量卡在索引中。 我们将它们以列的形式推出。 `pivot_table`方法将`columns`参数中使用的列名称保留为列索引的名称。 重置索引后,该名称变得毫无意义,我们使用`rename_axis`将其删除。
现在,结果中还有混乱的数据部分。如前面的秘籍“将多个变量存储为列值时进行整理”秘籍所述,当在`index`参数中使用多个列时,我们必须使用`pivot_table`来旋转数据帧。 旋转后,`Group``Year`变量卡在索引中。 我们将它们以列的形式推出。 `pivot_table`方法将`columns`参数中使用的列名称保留为列索引的名称。 重置索引后,该名称变得毫无意义,我们使用`rename_axis`将其删除。
# 更多
......@@ -1330,4 +1330,4 @@ True
# 另见
* 有关数据库规范化( [http://bit.ly/2w8wahQ](https://en.wikipedia.org/wiki/Database_normalization) ),关联表( [http://bit.ly/2yqE4oh](https://en.wikipedia.org/wiki/Associative_entity) )以及主键和外键( [http://bit.ly/2xgIvEb](https://en.wikipedia.org/wiki/Unique_key)
* 有关`wide_to_long`功能的更多信息,请参阅本章中的*同时堆叠多组变量* 秘籍
\ No newline at end of file
* 有关`wide_to_long`函数的更多信息,请参阅本章中的“同时堆叠多组变量”秘籍
\ No newline at end of file
......@@ -206,7 +206,7 @@ Name: 16, dtype: object
# 将多个数据帧连接在一起
通用的`concat`功能可将两个或多个数据帧(或序列)垂直和水平连接在一起。 通常,当同时处理多个 Pandas 对象时,串联并不是偶然发生的,而是通过它们的索引对齐每个对象。
通用的`concat`函数可将两个或多个数据帧(或序列)垂直和水平连接在一起。 通常,当同时处理多个 Pandas 对象时,串联并不是偶然发生的,而是通过它们的索引对齐每个对象。
# 准备
......@@ -431,7 +431,7 @@ dtype: object
![](img/00239.jpeg)
15. 在总统富兰克林·罗斯福(Franklin Roosevelt)第三任期期间,有总统支持率的评级数据可追溯到 1941 年。 通过我们的自定义功能以及`concat`功能,可以从该站点获取所有总统批准评级数据。 现在,让我们获取最后五位总统的支持率数据,并输出每位总统的前三行:
15. 在总统富兰克林·罗斯福(Franklin Roosevelt)第三任期期间,有总统支持率的评级数据可追溯到 1941 年。 通过我们的自定义功能以及`concat`函数,可以从该站点获取所有总统批准评级数据。 现在,让我们获取最后五位总统的支持率数据,并输出每位总统的前三行:
```py
>>> pres_41_45 = pd.concat([get_pres_appr(x) for x in range(41,46)],
......@@ -567,7 +567,7 @@ Name: Days in Office, dtype: int64
第 13 步构建了一个由所有先前步骤组成的功能,可以自动获得任何总裁的批准等级,前提是您拥有订单号。 功能上有一些差异。 并非将`ffill`方法应用于整个数据帧,我们仅将其应用于`President`列。 在 Trump 的数据帧中,其他列没有丢失数据,但这不能保证所有抓取的表在其他列中都不会丢失数据。 函数的最后一行以更自然的方式对日期进行排序,以便从最旧到最新进行数据分析。 这也改变了索引的顺序,因此我们将其与`reset_index`丢弃,以使其再次从零开始。
步骤 16 显示了一个常见的 Pandas 习惯用法,用于在将它们与`concat`功能组合在一起之前,将多个类似索引的数据帧收集到一个列表中。 连接到单个数据帧后,我们应该目视检查它以确保其准确性。 一种方法是通过对数据进行分组然后在每组上使用`head`方法来浏览每位总裁部分的前几行。
步骤 16 显示了一个常见的 Pandas 习惯用法,用于在将它们与`concat`函数组合在一起之前,将多个类似索引的数据帧收集到一个列表中。 连接到单个数据帧后,我们应该目视检查它以确保其准确性。 一种方法是通过对数据进行分组然后在每组上使用`head`方法来浏览每位总裁部分的前几行。
第 18 步的汇总统计数据很有趣,因为每位继任总统的中位数批准率均低于上一任总统。 推断数据会导致天真的预测未来几位总统的支持率为负面。
......@@ -676,7 +676,7 @@ The first parameter to the join method is `other` which can either be a single
![](img/00247.jpeg)
2. `concat`功能是唯一能够垂直组合数据帧的功能。 让我们通过将列表`stock_tables`传递给它:
2. `concat`函数是唯一能够垂直组合数据帧的功能。 让我们通过将列表`stock_tables`传递给它:
```py
>>> pd.concat(stock_tables, keys=[2016, 2017, 2018])
......@@ -865,7 +865,7 @@ Exception: cannot handle a non-unique multi-index!
>>> engine = create_engine('sqlite:///data/chinook.db')
```
2. 现在,我们可以回到 Pandas 世界,并在剩下的秘籍中呆在那里。 让我们完成一个简单的命令,并使用`read_sql_table`功能读取`tracks`表。 表的名称是第一个参数,SQLAlchemy 引擎是第二个参数:
2. 现在,我们可以回到 Pandas 世界,并在剩下的秘籍中呆在那里。 让我们完成一个简单的命令,并使用`read_sql_table`函数读取`tracks`表。 表的名称是第一个参数,SQLAlchemy 引擎是第二个参数:
```py
>>> tracks = pd.read_sql_table('tracks', engine)
......@@ -942,9 +942,9 @@ Name: Total, dtype: float64
# 工作原理
`create_engine`功能需要连接字符串才能正常工作。 SQLite 的连接字符串非常简单,它只是数据库的位置,位于数据目录中。 其他关系数据库管理系统具有更复杂的连接字符串。 您将需要提供用户名,密码,主机名,端口以及(可选)数据库。 您还需要提供 SQL 方言和驱动程序。 连接字符串的一般格式如下:`dialect+driver://username:password@host:port/database` 。 您特定的关系数据库的驱动程序可能需要单独安装。
`create_engine`函数需要连接字符串才能正常工作。 SQLite 的连接字符串非常简单,它只是数据库的位置,位于数据目录中。 其他关系数据库管理系统具有更复杂的连接字符串。 您将需要提供用户名,密码,主机名,端口以及(可选)数据库。 您还需要提供 SQL 方言和驱动程序。 连接字符串的一般格式如下:`dialect+driver://username:password@host:port/database` 。 您特定的关系数据库的驱动程序可能需要单独安装。
一旦创建了引擎,就可以使用步骤 2 中的`read_sql_table`功能将整个表选择到数据帧中非常容易。数据库中的每个表都有一个主键,该主键唯一地标识每一行。 在图中用图形符号标识它。 在第 3 步中,我们通过`GenreId`将流派链接到曲目。 因为我们只关心轨道长度,所以在执行合并之前,将轨道数据帧修剪为仅需要的列。 合并表格后,我们可以使用基本的`groupby`操作来回答查询。
一旦创建了引擎,就可以使用步骤 2 中的`read_sql_table`函数将整个表选择到数据帧中非常容易。数据库中的每个表都有一个主键,该主键唯一地标识每一行。 在图中用图形符号标识它。 在第 3 步中,我们通过`GenreId`将流派链接到曲目。 因为我们只关心轨道长度,所以在执行合并之前,将轨道数据帧修剪为仅需要的列。 合并表格后,我们可以使用基本的`groupby`操作来回答查询。
我们进一步走了一步,将整数毫秒转换为更容易阅读的 Timedelta 对象。 密钥以字符串形式传入正确的度量单位。 现在我们有了 Timedelta 系列,我们可以使用`dt`属性访问`floor`方法,该方法将时间向下舍入到最接近的秒。
......
......@@ -118,7 +118,7 @@ Timestamp('2017-09-30 13:30:00')
Timestamp('2013-04-11 00:00:00')
```
8. `to_datetime`功能具有更多功能。 它能够将整个列表或一系列字符串或整数转换为时间戳。 由于我们更可能与序列或数据帧交互,而不是与单个标量值交互,因此您比`Timestamp`更可能使用`to_datetime`
8. `to_datetime`函数具有更多功能。 它能够将整个列表或一系列字符串或整数转换为时间戳。 由于我们更可能与序列或数据帧交互,而不是与单个标量值交互,因此您比`Timestamp`更可能使用`to_datetime`
```py
>>> s = pd.Series([10, 100, 1000, 10000])
......@@ -387,7 +387,7 @@ dtype='datetime64[ns]', name='REPORTED_DATE', freq=None)
# 更多
我们原始的犯罪数据未排序,并且切片仍按预期工作。 对索引进行排序将导致性能大幅提高。 让我们看一下与第 8 步完成的切片的区别:
我们原始的犯罪数据未排序,并且切片仍按预期工作。 对索引进行排序将导致性能大幅提高。 让我们看一下与第 8 步完成的切片的区别:
```py
>>> %timeit crime.loc['2015-3-4':'2016-1-1']
......@@ -1025,7 +1025,7 @@ Name: REPORTED_DATE, dtype: int64
# 另见
* Pandas`reindex`方法的官方文档( [http://bit.ly/2y40eyE](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.reindex.html)
* `heatmap`功能的原始官方文档( [http://bit.ly/2ytbMNe](https://seaborn.pydata.org/generated/seaborn.heatmap.html)
* `heatmap`函数的原始官方文档( [http://bit.ly/2ytbMNe](https://seaborn.pydata.org/generated/seaborn.heatmap.html)
# 使用带有 DatetimeIndex 的匿名函数进行分组
......@@ -1289,7 +1289,7 @@ array([Interval(1958.0, 1970.0, closed='right'),
# 使用 merge_asof 查找上次犯罪率降低了 20%
很多时候,我们想知道上一次发生什么事情的时间。 例如,我们可能对上一次失业率低于 5% 或上一次股市连续五天上涨或上一次睡眠八个小时感兴趣。 `merge_asof`功能为这些类型的问题提供答案。
很多时候,我们想知道上一次发生什么事情的时间。 例如,我们可能对上一次失业率低于 5% 或上一次股市连续五天上涨或上一次睡眠八个小时感兴趣。 `merge_asof`函数为这些类型的问题提供答案。
# 准备
......
......@@ -460,7 +460,7 @@ Name: budget, dtype: float64
19.1
```
这些值与步骤 1 的输出相同。在步骤 2 中,通过将数据放入 NumPy 数组中,我们准备使用 matplotlib。 在第 3 步中,我们创建图形和轴以设置面向对象的界面。 `plt.subplots`方法支持大量输入。 请参阅文档以查看此功能和`figure`功能的所有可能参数( [http://bit.ly/2ydM8ZU](http://bit.ly/2ydM8ZU)[http://bit.ly/2ycno40](http://bit.ly/2ycno40) )。
这些值与步骤 1 的输出相同。在步骤 2 中,通过将数据放入 NumPy 数组中,我们准备使用 matplotlib。 在第 3 步中,我们创建图形和轴以设置面向对象的界面。 `plt.subplots`方法支持大量输入。 请参阅文档以查看此功能和`figure`函数的所有可能参数( [http://bit.ly/2ydM8ZU](http://bit.ly/2ydM8ZU)[http://bit.ly/2ycno40](http://bit.ly/2ycno40) )。
`plot`方法中的前两个参数表示折线图的 x 和 y 值。 所有行属性都可以在`plot`的调用中进行更改。 `set_title` Axes 方法提供标题,并可以在其调用内设置所有可用的文本属性。 `set_ylablel`方法也是如此。 如果要为许多对象设置相同的属性,则可以将它们打包在一起作为字典,然后将该字典作为参数之一传递,如`**text_kwargs`一样。
......@@ -472,7 +472,7 @@ Name: budget, dtype: float64
为了调查预算中位数的意外下降,我们可以仅关注每年预算最高的 10 部电影。 在按年份分组后,第 6 步使用自定义聚合函数,然后以与以前相同的方式对结果进行平滑处理。 这些结果可以直接绘制在同一张图上,但是由于值要大得多,因此我们选择创建一个带有两个轴的全新图形。
我们通过在两个两行一列的网格中创建具有两个子图的图形来开始执行步骤 7。 请记住,当创建多个子图时,所有轴都存储在 NumPy 数组中。 步骤 5 的最终结果将在顶部轴中重新创建。 我们在底部的轴上绘制预算最高的 10 部电影。 请注意,年份与底部和顶部轴都对齐,因为在图形创建中`sharex`参数设置为`True`。 共享轴时,matplotlib 会删除所有刻度线的标签,但会保留每个刻度线的细小垂直线。 要删除这些刻度线,我们使用`setp` `pyplot`功能。 尽管这不是直接面向对象的,但是当我们要为整个绘制对象序列设置属性时,它是显式的并且非常有用。 通过此有用的功能,我们将所有刻度线设置为不可见。
我们通过在两个两行一列的网格中创建具有两个子图的图形来开始执行步骤 7。 请记住,当创建多个子图时,所有轴都存储在 NumPy 数组中。 步骤 5 的最终结果将在顶部轴中重新创建。 我们在底部的轴上绘制预算最高的 10 部电影。 请注意,年份与底部和顶部轴都对齐,因为在图形创建中`sharex`参数设置为`True`。 共享轴时,matplotlib 会删除所有刻度线的标签,但会保留每个刻度线的细小垂直线。 要删除这些刻度线,我们使用`setp` `pyplot`函数。 尽管这不是直接面向对象的,但是当我们要为整个绘制对象序列设置属性时,它是显式的并且非常有用。 通过此有用的功能,我们将所有刻度线设置为不可见。
最后,我们然后多次调用 Figure 方法。 这与我们通常调用的 Axes 方法不同。 `tight_layout`方法通过删除多余的空间并确保不同的轴不会重叠来将子图调整为更好的外观。 `suptitle`方法为整个图形创建标题,而`set_title`轴方法则为单个轴创建标题。 它接受 x 和 y 位置来表示**图形坐标系**中的位置,其中(0,0)表示左下,而(1,1)表示右上。 默认情况下,y 值为 0.98,但我们将其上移了几个点至 1.02。
......@@ -686,7 +686,7 @@ dtype: int64
![](img/00326.jpeg)
4. 这不是对所有单变量统计信息的详尽研究,但为我们提供了一些变量的详细信息。 在继续进行多变量图绘制之前,让我们绘制出每周的飞行次数。 使用带有 *x* 轴上日期的时间序列图的正确情况。 不幸的是,我们在任何列中都没有 Pandas 时间戳,但确实有月和日。 `to_datetime`函数有一个巧妙的技巧,可以识别与时间戳记组件匹配的列名。 例如,如果您有一个数据架,其中的标题栏正好为三列`year``month,``day,`,则将该数据帧传递给`to_datetime`函数将返回时间戳序列。 要准备我们当前的数据帧,我们需要为年份添加一列,并使用计划的出发时间来获取小时和分钟:
4. 这不是对所有单变量统计信息的详尽研究,但为我们提供了一些变量的详细信息。 在继续进行多变量图绘制之前,让我们绘制出每周的飞行次数。 使用带有 *x* 轴上日期的时间序列图的正确情况。 不幸的是,我们在任何列中都没有 Pandas 时间戳,但确实有月和日。 `to_datetime`函数有一个巧妙的技巧,可以识别与时间戳记组件匹配的列名。 例如,如果您有一个数据架,其中的标题栏正好为三列`year``month,``day,`,则将该数据帧传递给`to_datetime`函数将返回时间戳序列。 要准备我们当前的数据帧,我们需要为年份添加一列,并使用计划的出发时间来获取小时和分钟:
```py
>>> hour = flights['SCHED_DEP'] // 100
......@@ -766,7 +766,7 @@ dtype: datetime64[ns]
![](img/00331.jpeg)
10. 正如预期的那样,距离和通话时间之间存在紧密的线性关系,尽管方差似乎随着里程数的增加而增加。 有一些航班不在趋势线之外。 让我们尝试识别它们。 可以使用线性回归模型来正式识别它们,但是由于 Pandas 不直接支持线性回归,因此我们将采用更为手动的方法。 让我们使用`cut`功能将飞行距离分为八组之一:
10. 正如预期的那样,距离和通话时间之间存在紧密的线性关系,尽管方差似乎随着里程数的增加而增加。 有一些航班不在趋势线之外。 让我们尝试识别它们。 可以使用线性回归模型来正式识别它们,但是由于 Pandas 不直接支持线性回归,因此我们将采用更为手动的方法。 让我们使用`cut`函数将飞行距离分为八组之一:
```py
>>> fs['DIST_GROUP'] = pd.cut(fs['DIST'], bins=range(0, 2001, 250))
......@@ -1114,7 +1114,7 @@ dtype: int64
Seaborn 将进行所有汇总; 您只需将数据帧提供给,,`data`,参数,并使用其字符串名称引用这些列。 例如,在步骤 3 中,`countplot`函数毫不费力地对`DEPARTMENT`的每次出现进行计数,以创建条形图。 所有海上绘图功能均具有`x``y`参数。 我们可以使用`x`而不是`y`绘制垂直条形图。 Pandas 会迫使您做更多的工作来获得相同的情节。 在第 4 步中,我们必须使用`value_counts`方法预先计算垃圾箱的高度。
Seaborn 可以使用`barplot`功能进行更复杂的聚合,如步骤 5 和 7 所示。 `hue`参数进一步在 *x* 轴上拆分每个组。 通过在步骤 6 和 8 中对 x 和 hue 变量进行分组,Pandas 能够几乎复制这些图。
Seaborn 可以使用`barplot`函数进行更复杂的聚合,如步骤 5 和 7 所示。 `hue`参数进一步在 *x* 轴上拆分每个组。 通过在步骤 6 和 8 中对 x 和 hue 变量进行分组,Pandas 能够几乎复制这些图。
箱形图可在海生和 Pandas 中使用,并且可以直接用整洁的数据绘制,而无需任何汇总。 即使没有必要进行聚合,seaborn 仍然具有优势,因为它可以使用`hue`参数将数据整齐地拆分为单独的组。 如步骤 10 所示,Pandas 无法轻松地从海洋中复制此功能。每个组都需要使用`query`方法进行拆分,并绘制在其自己的轴上。 实际上,Pandas 可能会拆分多个变量,从而将列表传递给`by`参数,但结果却不尽人意:
......@@ -1365,7 +1365,7 @@ Name: RACE, dtype: int64
在此秘籍中,创建分类列非常重要,因为可以对它们进行排序。 Seaborn 使用此顺序将标签放置在地块上。 第 3 步和第 4 步显示了明显增加钻石质量的下降趋势。 这就是辛普森悖论成为中心焦点的地方。 整体的汇总结果与其他尚未检查的变量混淆。
揭示这一矛盾的关键在于关注克拉的大小。 第 5 步向我们揭示克拉的大小也随着质量的增加而减小。 考虑到这一事实,我们使用`qcut`功能将钻石尺寸切成五个相等大小的容器。 默认情况下,此函数根据给定的分位数将变量分为离散类别。 通过像此步骤一样将整数传递给它,可以创建等距的分位数。 您还可以选择将一系列显式非规则分位数传递给它。
揭示这一矛盾的关键在于关注克拉的大小。 第 5 步向我们揭示克拉的大小也随着质量的增加而减小。 考虑到这一事实,我们使用`qcut`函数将钻石尺寸切成五个相等大小的容器。 默认情况下,此函数根据给定的分位数将变量分为离散类别。 通过像此步骤一样将整数传递给它,可以创建等距的分位数。 您还可以选择将一系列显式非规则分位数传递给它。
使用此新变量,我们可以绘制第 6 步中每组每颗钻石尺寸的平均价格的图。seaborn 中的点图将创建一个连接每个类别均值的线图。 每个点的竖线是该组的标准偏差。 该图证实,只要我们将克拉的大小保持不变,钻石的确会随着质量的提高而变得更加昂贵。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册