六、索引数据
索引是用于优化查询序列或数据帧中的值的工具。 它们很像关系数据库中的键,但是功能更强大。 它们为多组数据提供了对齐方式,还带有如何处理数据的各种任务(如重采样到不同频率)的语义。
您将对 Pandas 执行的许多建模工作很大程度上取决于您如何设置索引。 正确实现的索引将优化性能,并成为推动分析的宝贵工具。
我们之前曾简要地使用过索引,在本章中,我们将进行更深入的探讨。 在这次深入学习中,我们将详细了解:
RangeIndex
,Int64Index
,CategoricalIndex
,Float64Index
,Datetimeindex
和PeriodIndex
我们从 Pandas 的标准配置开始,但是我们也加载了 S&P 500 数据,以供几个示例使用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tzLDGKtX-1681365561311)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00226.jpeg)]
Pandas 索引允许有效地查找值。 如果不存在索引,则将需要对我们所有数据进行线性搜索。 索引使用直接查找而不是搜索过程为特定数据项创建优化的快捷方式。
为了开始检查索引的值,我们将使用以下10000
随机数的DataFrame
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O6TyaMjV-1681365561312)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00227.jpeg)]
假设我们要查找key==10099
处的随机数的值(我明确选择了此值,因为它是DataFrame
中的最后一行)。 我们可以使用布尔选择来做到这一点。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zsSZ5ga8-1681365561312)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00228.jpeg)]
从概念上讲,这很简单。 但是,如果我们想重复执行此操作怎么办? 可以使用%timeit
语句在 Python 中进行模拟。 以下代码重复执行查找并报告性能。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-toqaGkM9-1681365561313)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00229.jpeg)]
该结果表明,1,000 个循环执行了三次,并且这三次中最快的一次平均每个循环花费了 0.00535 秒(一组 1,000 个循环总计 5.35 秒)。
现在让我们尝试使用索引来帮助我们查找值。 以下代码设置此DataFrame
的索引以匹配keys
列的值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v3YwMxcp-1681365561313)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00230.jpeg)]
现在可以使用.loc[]
查找该值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SHAwy5Nl-1681365561313)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00231.jpeg)]
那只是一个查询。 让我们用%timeit
计时。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1PM1Ctvd-1681365561314)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00232.jpeg)]
使用索引的查找大约快五倍。 由于具有更高的性能,因此通常最好的方法是在可能的情况下按索引执行查找。 使用索引的不利之处在于构造索引可能会花费一些时间,并且还会消耗更多的内存。
很多时候,您会天生就知道索引应该是什么,您可以直接创建索引并开始探索。 其他时间,首先需要进行一些探索才能确定最佳指数。 通常,您可能没有足够的数据或适当的字段来创建适当的索引。 在这些情况下,您可能需要使用返回多个半歧义结果的部分索引,并且仍然对该集合执行布尔选择以获得所需的结果。
在执行探索性数据分析以首先加载数据并使用查询/布尔选择进行探索时,这是最佳实践。 如果您的数据自然支持一个索引,或者您确实需要提高速度,则创建索引。
Pandas 提供许多内置索引。 每种索引类型都根据特定的数据类型或数据模式设计用于优化查找。 让我们看看其中几种常用的。
Index
这种类型的索引是最通用的,表示一组有序和可切片的值。 它包含的值必须是可哈希的 Python 对象。 这是因为索引将使用此哈希来形成与该对象的值相关联的值的有效查找。 尽管哈希查找比线性查找更受青睐,但还有其他类型的索引可以进一步优化。
列索引通常是这种通用类型。 以下代码演示了如何将这种索引类型用作DataFrame
的列。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8V6UVEWb-1681365561314)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00233.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rtVrb8Wl-1681365561314)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00234.jpeg)]
虽然这种类型的索引通常对于字母数字列名非常有效,但是如果需要,可以使用其他类型的索引作为列索引。
Int64Index
和RangeIndex
的整数索引标签Int64Index
表示映射到值的不可变的 64 位整数数组。 直到更新版本的 pandas 为止,这是未指定索引或使用整数的默认索引类型,如以下代码片段所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zo2NesXn-1681365561315)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00235.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cV7goS2g-1681365561315)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00236.jpeg)]
使用此索引,DataFrame
中的行查找非常高效,因为它们是使用连续的内存中数组执行的。
Pandas 的最新版本添加了RangeIndex
作为Int64Index
的优化。 它具有表示基于整数的索引的能力,该索引从特定的整数值开始,具有结束的整数值,并且还可以指定步骤。
使用开始,停止和步进是一种常见的模式,因此需要向 Pandas 添加自己的子类。 通过使用这三个值,可以节省内存,并且执行时间与Int64Index
中的顺序相同。
RangeIndex
已成为 Pandas 对象的默认索引。 以下内容对此进行了演示,该示例创建了默认为RangeIndex
的整数值的序列。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V3RzlEXk-1681365561315)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00237.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tR6h3rKK-1681365561316)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00238.jpeg)]
Float64Index
的浮点标签通过使用Float64Index
,浮点数可用作索引标签。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JBFeXC5j-1681365561316)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00239.jpeg)]
请注意,此片返回了 11 行,而不是前 5 行。 这是因为Float64Index
,并且 Pandas 从一开始就将我们的意思表示为 5.0 之前的所有值。
IntervalIndex
表示离散间隔可以使用IntervalIndex
表示不同的标签桶。 该间隔在一端(左端或右端)关闭,这意味着该间隔的该端值包含在该间隔中。 以下代码显示了使用间隔作为索引创建DataFrame
的过程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ztIvQML-1681365561316)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00240.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-02lwFBG0-1681365561317)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00241.jpeg)]
CategoricalIndex
CategoricalIndex
用于表示基础类别的稀疏填充索引。 下面创建一个DataFrame
,其中一列为“类别”。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7tHzKT8J-1681365561317)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00242.jpeg)]
将类别列(B
)移到DataFrame
的索引中可以看到现在有CategoricalIndex
。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kTrLxPsV-1681365561317)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00243.jpeg)]
然后可以使用基础类别中的现有值执行查找。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vm3TDjps-1681365561318)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00244.jpeg)]
类别将在第 7 章“类别数据”中进行详细检查。
DatetimeIndex
的日期时间索引DatetimeIndex
用于表示一组日期和时间。 这些在时间序列数据中得到了广泛使用,在这些时间序列数据中,以特定的时间间隔采样。 为了简要说明这一点,下面的代码创建了5
-每小时时间段的范围,并将它们用作该序列的索引。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9KRpTO0h-1681365561318)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00245.jpeg)]
索引的类型可以看作是DatetimeIndex
。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qMafaLEg-1681365561319)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00246.jpeg)]
日期/时间的基本表示形式是 64 位整数,这使得按日期和时间进行查找非常有效。
PeriodIndex
的时间段索引能够表示诸如日,月或年之类的时间段也很重要。 这很像一个间隔,但要持续一段时间。 可以通过使用PeriodIndex
并为索引中的时间段指定特定频率来对这些场景进行建模。
下面通过对从2017-01
开始的三个 1 个月周期进行建模进行演示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vwb7ISEf-1681365561319)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00247.jpeg)]
然后可以在Series
或DataFrame
中使用该索引。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ANaexyfw-1681365561319)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00248.jpeg)]
在介绍了创建各种类型的 Pandas 索引之后,现在让我们检查一下这些索引的几种常见使用模式。 具体来说,我们将检查:
索引可以显式创建,也可以让 Pandas 隐式创建。 当您使用构造器的index
参数分配索引时,会显式创建。
以下代码通过首先独立创建DatetimeIndex
进行演示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hCnuth9A-1681365561319)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00249.jpeg)]
您可以单独使用此索引,也可以将其与Series
或DataFrame
关联。 此代码利用索引创建一个DataFrame
。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W5Ut8run-1681365561320)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00250.jpeg)]
通过设置.index
属性,也可以将索引直接分配给现有的DataFrame
或序列。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-caWWrwob-1681365561320)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00251.jpeg)]
可以使用[]
运算符使用索引或使用Series
或DataFrame
的以下属性索引器来查找值:
.loc[] | 通过标签而不是位置查找。 但小心点; 如果标签是整数,则整数将被视为标签! |
.at[] | 类似于.loc[],但这只能检索单个值。 |
.iloc[] | 查找基于基于0的位置,而不是基于索引标签。 |
.ix[] | 混合,当给出整数时将尝试基于0的查找; 其他类型是基于标签的。 将不建议使用此属性,因此请保留其他三个属性。 |
可以使用[]
运算符在Series
中查找值,如以下DataFrame
所示,该运算符已检索到b
值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iRrasH29-1681365561320)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00252.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mHYJLKDw-1681365561321)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00253.jpeg)]
在Series
上使用[]
进行查找等同于使用.loc[]
属性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C3zLwM6D-1681365561321)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00254.jpeg)]
[]
运算符应用于DataFrame
时,检索列而不是行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GotIexiZ-1681365561321)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00255.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FtPYi0pY-1681365561321)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00256.jpeg)]
若要使用DataFrame
通过行索引进行查找,必须使用属性索引器之一。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7N5rcFdI-1681365561322)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00257.jpeg)]
属性索引器表单也可以使用切片。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MPkp16ES-1681365561322)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00258.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BXLluSAk-1681365561323)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00259.jpeg)]
并且还可以传递值列表。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VaINKcvg-1681365561323)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00260.jpeg)]
通过使用.reset_index()
可以重置DataFrame
对象的索引。 通常将其用于将DataFrame
对象的索引的内容移到一个或多个列中。
以下代码将sp500
索引中的符号移到一列中,并将索引替换为默认的整数索引。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0uY2stzW-1681365561323)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00261.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GHxNhTEa-1681365561324)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00262.jpeg)]
可以使用.set_index()
方法并通过指定要移动的列将数据列移动到DataFrame
对象的索引。 以下代码将Sector
列移至索引。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AcitWnth-1681365561324)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00263.jpeg)]
可以将多个列移至索引,从而形成一个层次/多索引。 层次结构索引将在本章后面介绍。
可以使用.reindex()
方法重新索引DataFrame
。 重新索引使DataFrame
符合新索引,将旧索引中的数据与新索引对齐,并在对齐失败的地方填充NaN
。
此代码演示将sp500
重新索引到三个指定的索引标签。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4RwRzG12-1681365561324)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00264.jpeg)]
此过程将创建具有指定行的新DataFrame
。 如果未找到特定值的行,则将插入NaN
值,如'FOO'
标签所示。 这种方法实际上是一种基于索引标签过滤出数据的好技术。
重新索引也可以在列上完成,如下面的代码所示,用于指定的三个列名称:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ns3SZqNz-1681365561324)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00265.jpeg)]
由于NewCol
的值未包含在原始数据中,因此将为其插入NaN
值。
分层索引是 Pandas 的一项功能,它允许每行结合使用两个或多个索引。 层次结构索引中的每个索引都称为一个级别。 索引中多个级别的规范允许使用每个级别的值的不同组合来有效选择数据的不同子集。 从技术上讲,具有多个层次结构的 Pandas 索引称为MultiIndex
。
以下代码演示了使用sp500
数据通过MultiIndex
创建和访问数据。 假设我们要通过Sector
和Symbol
的值来组织此数据,以便我们可以基于来自两个变量的值的组合来有效地查找数据。 我们可以使用以下代码将Sector
和Symbol
的值移动到MultiIndex
中,以完成此操作:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lcMeyYw7-1681365561325)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00266.jpeg)]
.index
属性现在显示索引为MultiIndex
对象:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TcQOD3fk-1681365561325)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00267.jpeg)]
如上所述,MultiIndex
对象包含两个或多个级别,在这种情况下为两个:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-puZpZmcr-1681365561325)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00268.jpeg)]
每个级别都是一个不同的Index
对象:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7jXdcLdN-1681365561326)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00269.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2D2hph0Y-1681365561326)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00270.jpeg)]
可以通过.get_level_values()
方法检索每行特定级别的索引本身的值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZMjFaZmi-1681365561326)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00271.jpeg)]
使用.xs()
方法通过层次索引访问DataFrame
对象中的值。 此方法的工作方式类似于.ix
属性,但是提供了用于指定索引多维性的参数。
以下代码选择索引标签为Industrials
的所有项目:0
(Sector
):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nU4MvD4f-1681365561326)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00272.jpeg)]
结果DataFrame
的索引由未指定的级别组成,在这种情况下为Symbol
。 从结果索引中删除为其指定值的级别。
level
参数可用于选择在指定级别具有特定索引值的行。 以下代码选择索引的Symbol
分量为ALLE
的行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LfY4XxlK-1681365561327)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00273.jpeg)]
为了防止电平下降(如果您未指定每个级别),可以使用drop_levels=False
选项。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9cB6U7Rl-1681365561327)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00274.jpeg)]
要从索引层次结构中进行选择,可以将具有不同级别的.xs()
调用链接在一起。 下面选择级别为0
的Industrials
和级别为1
的UPS
的行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aVRRPC7v-1681365561327)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00275.jpeg)]
另一种语法是将层次结构索引的每个级别的值作为元组传递。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-guypxmg8-1681365561328)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00276.jpeg)]
请注意,.xs()
仅可用于获取,而不能用于设置值。
在本章中,我们更深入地研究了在 Pandas 中使用索引来组织和检索数据。 我们研究了许多有用的索引类型,以及它们如何与不同类型的数据一起使用以有效访问值而无需查询行中的数据。 最后,我们对使用分层索引的研究进行了总结,该分层索引能够有效地检索与多个索引中的标签匹配的数据,从而为我们提供了选择数据子集的有力手段。
至此,我们已经涵盖了 Pandas 的许多基本建模部分。 在下一章中,我们将研究用 Pandas 表示分类变量。
类别变量是统计信息中的一种变量,代表一组有限的且通常是固定的值。 这与连续变量相反,连续变量可以表示无限数量的值。 类别变量的常见类型包括性别(其中有两个值,分别是男性和女性)或血液类型(可以是一小批血液类型之一,例如 A,B 和 O)。
pandas 可以使用一种称为Categorical
的 pandas 对象来表示类别变量。 这些 Pandas 对象旨在有效地表示分组为一组存储桶的数据,每个存储桶由代表其中一个类别的整数代码表示。 这些基础代码的使用使 Pandas 能够有效地表示类别集,并可以跨多个类别变量执行数据的排序和比较。
在本章中,我们将学习有关类别法的以下内容:
我们使用以下导入和配置语句开始本章中的示例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ln1As6ff-1681365561328)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00277.jpeg)]
Pandas 类别用于表示类别变量。 类别变量由一组有限的值组成,通常用于将值映射到一组类别中,并跟踪每个类别中存在多少个值。 另一个目的是将连续值的各个部分映射到一组离散的命名标签中,其一个示例是将数字等级映射到字母等级。 在本章的最后,我们将研究如何执行这种映射。
有几种创建类别 Pandas 的方法。 以下屏幕截图演示了如何直接从列表创建类别:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pLH1mGqz-1681365561328)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00278.jpeg)]
此类别是从包含五个字符串和三个不同值的列表创建的:低,中和高。 创建类别时,Pandas 会确定列表中的每个唯一值并将其用作类别。
可以使用.categories
属性检查以下类别:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UkJhb5af-1681365561329)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00279.jpeg)]
类别创建了一个索引,该索引由提供的列表中的三个不同值组成。
类别的值可以使用.get_values()
检索:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QeQ2yPxJ-1681365561329)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00280.jpeg)]
类别的每个类别都分配有一个整数值。 此值称为代码。 可以使用.codes
属性访问这些分配的代码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4UFCwQ2P-1681365561329)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00281.jpeg)]
这些代码有效地表示每个值在类别索引中的位置。 在这种情况下,映射是low=1
,high=0
和mid=2
。 此排序可能没有逻辑意义,由 Pandas 通过串行处理lmh_values
数组中的字符串来确定。
通过使用categories
参数指定类别,可以更好地控制此排序。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PfbTQZmS-1681365561329)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00282.jpeg)]
请注意在构造器中指定的类别的新顺序。 由于此顺序,代码现在为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wVDyG2aA-1681365561330)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00283.jpeg)]
现在,它表示low=0
,mid=1
和high=2
的映射。这更加有用,因为它可用于按与每个类别的含义及其与其他类别的关系相匹配的顺序对值进行排序。 在类别类别时,将使用代码而不是实际值进行类别。 以下演示lmh_cat
的排序:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZxByIt0u-1681365561330)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00284.jpeg)]
类别变量也可以表示为一个序列,其dtype
被指定为"category"
。 以下屏幕快照演示了如何获取类别列表并创建具有dtype
类别的Series
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ipKcxZlm-1681365561330)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00285.jpeg)]
使用类别创建Series
的另一种方法是先创建Series
,然后使用.astype('category')
方法将一列转换为类别。 下面的屏幕截图通过创建一个数据帧并将其值转换为category
的第二列来说明这一点,该数据帧的一列然后是第二列。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-axWUmLUK-1681365561330)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00286.jpeg)]
创建为类别的序列包含.cat
属性,该属性允许访问Series
使用的类别:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tRtqxj5e-1681365561332)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00287.jpeg)]
该变量是CategoricalAccessor
对象,它允许访问基础类别的各种属性。 例如,以下代码获取类别:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-umiU0fk3-1681365561332)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00288.jpeg)]
几个 Pandas 函数还返回类别。 一种是pd.cut()
,它会在特定值范围内创建对象箱。 以下屏幕截图演示了将代表0
和100
之间的5
随机数的值的序列切入 10 个类别箱,每个箱子宽 10 个整数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4BgyX0rA-1681365561332)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00289.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TRKZhZSq-1681365561333)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00290.jpeg)]
Group
列表示由cut
函数创建的类别变量,每个索引级别的值表示该值已与之关联的特定类别。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6EplMM72-1681365561333)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00291.jpeg)]
可以使用ordered = True
指定类别的显式顺序。 此信息意味着类别的顺序很重要,并且可以比较多个类别的类别变量中的值。 为了说明这一点,下面的代码创建了一个有序的类别,代表三种金属(以及这三个类别的四个值):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kODIER1F-1681365561333)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00292.jpeg)]
创建的类别具有bronze
的严格排序,其重要性低于silver
,而silver
的重要性低于gold
。
此排序可用于将一个类别类别或与另一个类别进行比较。 为了说明这一点,让我们创建以下类别,将其取反:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccvzQxwp-1681365561334)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00293.jpeg)]
这两个类别变量可以相互比较。 以下代码显示了每种金属是否比另一种类别中相同索引标签上的相应金属价值低:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u4dy9R5h-1681365561334)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00294.jpeg)]
Pandas 通过对每个值匹配基础代码来执行此比较。 金属变量具有以下代码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gJg8LgHM-1681365561334)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00295.jpeg)]
并且metals_reveresed_values
具有以下代码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VXQV8yMb-1681365561335)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00296.jpeg)]
逻辑运算符的应用导致前面显示的结果。
作为创建类别的最后一个示例,以下屏幕截图演示了如何创建一个类别,该类别指定的值(copper
)不是指定类别之一。 在这种情况下,Pandas 将用NaN
代替该值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XtP6gdiY-1681365561335)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00297.jpeg)]
此技术可用于在创建时筛选出不适合类别的值。
通过为.categories
属性分配新值或使用.rename_categories()
方法,类别人员可以重命名值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W8AcWsZU-1681365561335)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00298.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8qlJDNis-1681365561335)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00299.jpeg)]
请注意,这是就地修改。 为了防止就地修改,我们可以使用.rename_categories()
方法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hznTnL7x-1681365561336)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00300.jpeg)]
我们可以验证这不是就地完成的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lsU49ch1-1681365561336)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00301.jpeg)]
可以使用.add_categories()
方法附加类别。 以下代码将copper
类别添加到我们的金属中。 除非明确告知 Pandas 这样做,否则不会就地进行:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bVQLMAJh-1681365561336)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00302.jpeg)]
可以使用.remove_categories()
方法删除类别。 删除的值将替换为np.NaN
。 以下屏幕截图通过删除bronze
类别来演示此操作:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9jdtdVy7-1681365561336)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00303.jpeg)]
可以使用.remove_unused_categories()
删除未使用的类别,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a0hYb07w-1681365561337)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00304.jpeg)]
也可以使用.set_categories()
方法在一个步骤中添加和删除类别。 鉴于以下Series
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CKSKz958-1681365561337)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00305.jpeg)]
以下代码将类别设置为"one"
和"four"
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qUPWhSvX-1681365561337)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00306.jpeg)]
结果将NaN
替换为现在不存在的类别。
类别上的.describe()
方法将以类似于Series
或DataFrame
的方式产生描述性统计信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3hYBCjxs-1681365561337)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00307.jpeg)]
结果为我们提供了每个类别的实例数量以及每个类别的频率分布。
可以使用.value_counts()
获得每个类别的值计数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uNScohHu-1681365561338)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00308.jpeg)]
最小值,最大值和众数可以使用相应的方法找到。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ihTC3YcE-1681365561338)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00309.jpeg)]
现在让我们看一下应用类别法来帮助我们根据类别而不是数字来组织信息。 我们将要研究的问题是根据学生的数字等级为其分配字母等级。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1gebDfA1-1681365561338)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00310.jpeg)]
该数据帧代表每个学生的原始分数。 接下来,我们将数字等级分解为字母代码。 以下代码定义每个等级的箱以及每个箱的关联字母等级:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oBOOfq4K-1681365561338)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00311.jpeg)]
使用这些值,我们可以执行分配字母等级的剪切。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lTFw6E3Y-1681365561339)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00312.jpeg)]
检查基础类别,将显示以下代码的创建方式以及字母等级与值的关系:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vvgpLokj-1681365561339)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00313.jpeg)]
要确定每个年级有多少学生,我们可以使用.cat.value_counts()
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uE7gsf3U-1681365561339)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00314.jpeg)]
由于字母等级的类别具有字母等级的逻辑顺序,因此通过使用它在类别列上进行排序,我们可以从最高到最低字母等级对学生进行排序。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GpXXWtpN-1681365561340)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00315.jpeg)]
在本章中,我们研究了如何使用 pandas 类别对类别变量建模。 我们首先回顾了创建类别的方法,并查看了几个如何使用基础整数代码对每个类别进行类别的示例。 然后,我们研究了创建类别后修改类别的几种方法。 本章以使用类别将数据分解为一组命名容器的示例作为结尾。
在下一章中,我们将对 Pandas 数据进行数值和统计分析。
pandas 在建模和处理数据方面非常强大,但它也提供了许多用于数值和统计分析的强大工具。 这些功能与 Pandas 数据结构紧密集成在一起,因此一旦对数据建模就可以使复杂的计算变得非常简单。
本章将研究许多这些功能。 它从常见的数值方法开始,例如跨多个对象对齐的算术,以及查找特定的值(例如最小值和最大值)。 然后,我们将研究 Pandas 的许多统计能力,例如使用分位数,值排名,方差,相关性以及许多其他功能。
最后但并非最不重要的一点,我们将研究 Pandas 提供的一种非常强大的功能,称为滚动窗口。 滚动窗口提供了一种应用各种方法的方法,例如对规则数据子集进行均值计算。 这些类型的操作对于各种分析都是至关重要的,例如确定随着时间变化的股票数据的几个特征。 该概念将在本章中介绍,我们将在后面的章节中更详细地介绍它。
本章涉及很多内容,包括:
我们将使用标准的 Pandas 导入和配置,从以下环境配置开始。 除了正常导入和格式化外,我们还将导入 S&P 500 数据和每月股票数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zZLEN2fV-1681365561340)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00316.jpeg)]
Pandas 提供了丰富的功能和操作集,这些功能和操作有助于执行算术运算和计算数据的各种数值特征。 在本节中,我们将研究其中的许多内容,包括:
可以使用+
,-
,/
和*
运算符在数据帧(和序列)上执行算术运算。 尽管它们在本质上看似微不足道,但 Pandas 通过对等式左侧和右侧的值进行对齐来增加强大的效果。 因此,索引在算术中起着很大的作用,Pandas 用户必须了解索引如何影响结果。
此外,Pandas 不仅提供了算术的标准运算符,而且还提供了几种方法.add()
,.sub()
,.mul()
和.div()
,它们在指定应用坐标轴时提供了更高的性能和更大的灵活性。
使用标量值的算术运算将应用于DataFrame
的每个元素。 为了说明这一点,我们从以下四列随机数的数据帧开始:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IlHzaM9K-1681365561340)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00317.jpeg)]
默认情况下,所有算术运算都将应用于数据帧的所有行和列。 这将导致包含结果的新DataFrame
对象(使original
保持不变):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YKGYozpJ-1681365561340)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00318.jpeg)]
当在DataFrame
和Series
之间执行操作时,Pandas 将Series
索引沿DataFrame
列对齐,执行所谓的逐行广播。 这可能有点违反直觉,但是在逐行的基础上在每列中应用不同的值时,它是非常强大的。
为了说明这一点,下面的示例检索DataFrame
的第一行,然后从每一行中减去该行,从根本上导致每一行的值与第一行之差:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9CFQVlTT-1681365561340)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00319.jpeg)]
当通过从Series
对象中减去DataFrame
来反转顺序时,此过程也适用,因为 Pandas 足够聪明,可以找出正确的应用:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ASE7fOvX-1681365561341)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00320.jpeg)]
由算术运算得到的一组列将是序列索引和DataFrame
对象的列索引中的标签的并集(根据对齐规则)。 如果在Series
或DataFrame
对象中均未找到表示结果列的标签,则这些值将用NaN
填充。 以下代码通过创建一个Series
来演示此操作,该索引的索引表示DataFrame
中列的子集,但带有一个附加标签:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YjzZNXY8-1681365561341)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00321.jpeg)]
pandas 将df
的索引标签与s2
的索引标签对齐。 由于s2
在列中没有A
或D
标签,因此结果在这些列中包含NaN
。 并且由于df
没有E
标签,因此它也充满了NaN
(即使Series
中存在E
)。
两个DataFrame
对象之间的算术运算将同时按列标签和索引标签对齐。 以下代码提取了df
的一小部分,并将其从完整的数据帧中减去。 结果表明,对齐的值减去 0,而其他值设置为NaN
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jaEzC6jW-1681365561358)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00322.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Orgn7ZbT-1681365561359)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00323.jpeg)]
使用DataFrame
对象提供的算术方法可以获得对算术运算的附加控制。 这些方法提供了特定轴的规范。 下面的代码演示了从每列中减去A
列值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eHdJfx24-1681365561359)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00324.jpeg)]
.count()
方法为我们提供Series
中非NaN
项目的计数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hIcQyScd-1681365561359)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00325.jpeg)]
可以使用.unique()
获得序列中唯一值的列表:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a4WvmPaC-1681365561359)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00326.jpeg)]
可以使用.nunique()
获得唯一值的数目(NaN
除外):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WfktuchR-1681365561360)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00327.jpeg)]
要在结果中包含NaN
,请使用dropna=False
作为参数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-apdTkEA5-1681365561360)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00328.jpeg)]
可以使用.value_counts()
(此过程也称为直方图)确定每个唯一值的计数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0fvhWiVN-1681365561360)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00329.jpeg)]
可以使用.min()
和.max()
确定最小值和最大值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h5RYbczi-1681365561360)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00330.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BUqHhGwE-1681365561360)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00331.jpeg)]
一些 Pandas 统计方法被称为间接统计,因为它们不返回实际值,而是间接的相关值。 例如,.idxmin()
和.idxmax()
返回存在最小值和最大值的索引位置。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E7wS9wtb-1681365561361)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00332.jpeg)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zE3vmamc-1681365561361)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00333.jpeg)]
有时我们需要知道数据集中的 n 个最小值和 n 个最大值。 这些可以使用.nsmallest()
和.nlargest()
找到。 下面的代码通过返回MSFT
的 4 个最小值来说明这一点。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u2aMt1Dd-1681365561361)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00334.jpeg)]
同样,最大的 4 个值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uu2DGRZF-1681365561361)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00335.jpeg)]
序列的形式略有不同,因为没有要指定的列。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5fcoc5y7-1681365561361)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00336.jpeg)]
累加是通过将Series
中的下一个值连续应用于运行结果来确定值的统计方法。 很好的例子是一个序列的累积乘积和累积和。 以下代码演示了累积积的计算。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xSEaBGeL-1681365561362)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00337.jpeg)]
结果是另一个Series
,代表每个位置的累加值。 这是相同Series
的累加总和的计算。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-80MxpDhS-1681365561362)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00338.jpeg)]
描述性统计数据使我们能够理解描述基础数据特定特征的大量数据度量。 内置于 Pandas 中的是这些描述性统计操作的几类,它们可以应用于序列或数据帧。
让我们研究一下 Pandas 提供的统计分析/技术的几个方面:
pandas 对象提供.describe()
方法,该方法返回一组对象数据的摘要统计信息。 当应用于DataFrame
时,.describe()
将计算每列的摘要统计信息。 以下代码为omh
中的两只股票计算这些统计数据。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fMuG9URb-1681365561362)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00339.jpeg)]
通过一次快速的方法调用,我们计算了两个序列股票数据的计数,均值,标准差,最小值和最大值,甚至 25% ,50% 和 75%。
.describe()
也可以应用于序列。 以下代码仅计算MSFT
的摘要统计信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2a9N0LtE-1681365561362)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00340.jpeg)]
并且只有平均值可以如下获得。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yS35XaIk-1681365561362)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00341.jpeg)]
非数字数据将导致一组稍微不同的摘要统计信息,返回项目总数(count
),唯一值的计数(unique
),最频繁出现的值(top
)和出现的次数(freq
):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PR4mMYvK-1681365561363)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00342.jpeg)]
平均值和中位数为我们提供了几种有用的数据度量方式,可帮助我们开始理解值的分布以及该分布的形状。 这三个值的关系为我们提供了形状的快速聚合概念,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vbvuGFDG-1681365561363)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00343.jpeg)]
现在,让我们研究一下如何使用 Pandas 查找这些值。
该平均值通常称为平均值,它使我们可以测量数据的中心趋势。 通过将所有测量值相加然后除以测量值数来确定。
可以使用.mean()
计算平均值。 以下代码计算AAPL
和MSFT
的平均价格:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iBX15JAq-1681365561363)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00344.jpeg)]
Pandas 选择了每一列,并独立计算了每一列的平均值。 它以列名索引的序列中的值形式返回结果。 默认设置是将方法应用于axis=0
,将函数应用于每一列。 此代码切换轴并返回每天所有股票的平均价格:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5f9JAiHO-1681365561364)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00345.jpeg)]
中位数使我们在值的序列中处于中心位置。 根据定义,中位数是数据中存在相同数量的其他值均小于或大于该值的值。 中位数很重要,因为它不受外部值和非对称数据的影响,而不是均值。
值的中位数使用.median()
确定:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCvWr6Ai-1681365561364)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00346.jpeg)]
该众数是序列的最常见值,可通过.mode()
找到。 以下代码确定给定序列的众数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YySsC03x-1681365561364)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00347.jpeg)]
注意,这没有返回表示众数的标量值,而是返回了一个序列。 这是因为序列的众数可以有多个值。 下面的示例对此进行了演示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xQQa5wcv-1681365561364)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00348.jpeg)]
在概率论和统计学中,标准差和方差使我们感觉到一些数字与平均值之间的距离有多远。 让我们简要地检查一下。
方差使我们感觉到平均值的均值散布量。 定义如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qVTUv53f-1681365561365)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00349.jpeg)]
本质上,这说明对于每次测量,我们都会计算出值与平均值之间的差值。 这可以是正值或负值,因此我们对结果求平方以确保负值对结果有累积影响。 然后将这些值相加并除以测量值减 1,得出差值平均值的近似值。
在 Pandas 中,使用来计算方差。 var()
方法。 以下代码计算两种股票的价格差异:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8TeBVdFD-1681365561365)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00350.jpeg)]
标准差与方差相似。 它是通过计算方差的平方根确定的,定义如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JyOmaTfU-1681365561365)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00351.jpeg)]
请记住,方差是所有测量值与均值之差的平方。 因此,方差不在相同的单位和实际值之间。 通过使用方差的平方根,标准差的单位与原始数据集中的值相同。
使用.std()
方法计算标准差,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8AaSCNQ8-1681365561365)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00352.jpeg)]
协方差和相关性描述了两个变量之间的关系。 此关系可以是以下之一:
协方差和相关性都表明变量是正相关还是逆相关。 相关性还告诉您变量趋于一起移动的程度。
协方差指示两个变量之间的关系。 正协方差意味着变量是正相关的,而负协方差意味着它们是负相关的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PrEhvY6a-1681365561365)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00353.jpeg)]
可以使用.cov()
方法计算协方差。 以下代码计算MSFT
和AAPL
之间的协方差:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PQA4DDDV-1681365561366)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00354.jpeg)]
协方差可以帮助确定值是否相关,但是并不能给变量一起移动的程度提供感觉。 为了衡量变量一起移动的程度,我们需要计算相关性。 通过将协方差除以两组数据的标准差的乘积来计算相关性:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9weJK1OJ-1681365561366)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00355.jpeg)]
相关性标准化了两个变量之间相互依存的度量,因此可以告诉您两个变量的移动程度。 相关度量称为相关系数,将始终取 1 和 -1 之间的值,该值的解释如下:
使用.corr()
方法计算 Pandas 中的相关性。 以下代码计算MSFT
与AAPL
的相关性。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jOhM3dn5-1681365561366)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00356.jpeg)]
这表明在此期间MSFT
和APPL
的价格显示出很高的相关性。 这并不意味着它们是因果关系,一个因素会影响另一个因素,而是对价值有共同的影响,例如在相似的市场中。
离散化是将连续数据切成一组桶的一种方法。 然后,每个值都与一个代表性的容器关联。 然后可以使用每个仓中值计数的结果分布来了解跨不同仓的数据的相对分布。
使用pd.cut()
和pd.qcut()
函数在 Pandas 中离散化。 为了演示,让我们从使用普通随机数生成器创建的以下10000
随机数集开始:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xxVZzpdn-1681365561366)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00357.jpeg)]
这段代码向我们展示了该数据集的平均值和标准差,随着数据集样本量的增加(因为这是正常的),我们期望它们接近 0 和 1:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M1dHIn1d-1681365561367)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00358.jpeg)]
我们可以使用pd.cut()
将数字分成相等大小的桶。 以下代码创建五个大小均等的容器,并确定值的映射:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xn42WeCx-1681365561367)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00359.jpeg)]
生成的bins
对象是 pandas 类别变量。 它由一组标签和一个描述数据拆分方式的索引组成。 的。 categories
属性将返回索引,并指定 Pandas 确定的间隔(给定值的范围和指定的仓数):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Erj72CR3-1681365561367)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00360.jpeg)]
.codes
属性是一个数组,用于指定已为每个项目分配哪些仓位(间隔):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dwxr3YUR-1681365561367)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00361.jpeg)]
间隔的符号遵循标准的数学间隔,其中的括号表示末尾是开放的,而方括号表示封闭的。 封闭端包含该确切数字的值。 默认情况下,pandas 关闭间隔的右侧。 可以使用pd.cut()
的right=False
参数将封闭端移到间隔的左侧:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7otATTf8-1681365561368)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00362.jpeg)]
您可以传递一个代表桶的范围的值数组,而不是传递整数个 bin 以将数据切入其中。 一个常见的示例涉及将年龄映射到年龄段存储桶中。 为了证明这一点,以下代码生成了 6 和 45 之间的 50 年龄:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z6ZjOLvH-1681365561368)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00363.jpeg)]
我们可以通过将桶传递到数组中来指定桶的范围,其中相邻值代表每个桶的范围。 此代码将数据切入指定的桶中,并报告在每个桶中找到的年龄的分布。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hmvam4D0-1681365561368)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00364.jpeg)]
要为每个桶指定一个不同于标准数学符号的名称,请使用labels
参数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XfIBII7B-1681365561368)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00365.jpeg)]
标签的这种分配不仅方便文本输出,而且在绘制桶时都非常方便,因为 Pandas 会传递桶名称以在图表上进行绘制。
也可以使用pd.qcut()
根据指定的分位数对数据进行切片。 此函数会将值切成桶,以便每个桶具有相同数量的项目。 根据此结果,我们可以确定值计数均匀分布的桶的范围。
以下代码将随机值从之前拆分为5
分位数箱:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UiO3m8MA-1681365561369)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00366.jpeg)]
代替指定整数的箱数,还可以指定分位数范围。 以下代码根据正负 3 , 2 和 1 个标准差分配桶。 由于这是正态分布的数据,因此我们期望值的百分之 0.1,2.1,13.6 和 34.1 位于均值的每一边。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJTUycJz-1681365561369)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00367.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VJnIR94x-1681365561369)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00368.jpeg)]
这些正是我们期望从该分布中获得的结果。
排名有助于我们确定以下两项中的一项是排名较高还是排名较低。 排名将度量减少为序数序列,这些序数可用于评估复杂标准,并基于结果顺序。
为了演示排名,我们将使用以下数据序列:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EQrpLyFm-1681365561370)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00369.jpeg)]
然后可以使用.rank()
对这些值进行排名,默认情况下,该值告诉我们标签从最低值到最高值的顺序:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NGPqdqG9-1681365561370)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00370.jpeg)]
结果代表数值从最小到最大的顺序(本质上是一种排序)。 最低的是1.0
处的d
(其最低值是 -0.555730),并且在5.0
处的排名上升到e
(值 1.965781)。
您可以使用许多选项来更改此默认行为,例如,指定自定义排名函数以及在出现平局时如何确定排名。
可以使用.pct_change()
方法来计算给定时间段内的百分比变化。 百分比变化的示例用法是计算股票价格的变化率。 以下代码显示了MSFT
的代码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ltb4QV0-1681365561370)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00371.jpeg)]
Pandas 提供了许多函数来计算移动(也称为滚动)统计信息。 滚动窗口根据指定的数据间隔计算指定的统计信息。 然后将窗口沿数据移动特定的时间间隔并重新计算。 该过程一直持续到窗口在整个数据集上滚动为止。
为了证明这一点,我们将从1000
随机数的序列开始,这些随机数被累加起来形成一个随机游动:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iXq3Q6h7-1681365561371)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00372.jpeg)]
放大前 100 个值,我们可以看到以下图所示的数据移动:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MTkMWQLy-1681365561371)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00373.jpeg)]
要开始创建滚动窗口,我们使用带有指定窗口的.rolling()
方法创建一个Rolling
对象。 在这种情况下,我们要创建3
的滚动窗口:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Hf5tykI-1681365561371)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00374.jpeg)]
此rolling
对象指定我们希望窗口的宽度,但尚未执行实际的计算。 为此,我们可以选择表示统计操作的rolling
对象的多种方法之一(下图显示了其中的几种):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nqjtA6S4-1681365561371)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00375.jpeg)]
该代码演示了如何计算数据的滚动平均值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0TaUD9Rv-1681365561371)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00376.jpeg)]
因为我们的窗口大小是N = 3
,所以结果的第一个均值在索引标签 2 处。 我们可以验证该值是前三个数字的平均值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zKqOKD3x-1681365561372)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00377.jpeg)]
然后,窗口沿数据滚动一个间隔。 计算的下一个值在标签 3 处,代表标签 1 , 2 和 3 的平均值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2i73PIbu-1681365561372)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00378.jpeg)]
将滚动平均值的结果绘制在第一个 100 值上可以得出以下结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EtgqOmBN-1681365561372)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00379.jpeg)]
通过将该图与上一个图进行比较可以看出,滚动平均值可以使区间中的数据变得平滑。
随机采样是从随机位置的数据样本中选择值的过程。 从 pandas 0.19.2 开始,此功能已添加到 pandas Series
和DataFrame
对象,而在以前的版本中,您必须自己编写此过程。
为了演示随机采样,让我们从下面的DataFrame
开始,它代表 50 行随机数的四列:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCtUHuEU-1681365561372)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00380.jpeg)]
在指定要检索的样本数量的同时,我们可以使用.sample()
方法获取数据样本。 以下代码对三个随机行进行采样:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e3wWG9Ub-1681365561372)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00381.jpeg)]
另一种形式是指定要随机选择的数据百分比。 此代码选择 10% 的行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nwXOwvjA-1681365561373)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00382.jpeg)]
可以在有或没有替换的情况下对 Pandas 采样,默认情况下不替换。 要指定我们要使用替换,我们只需使用replace=True
参数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cwSiZ0Y0-1681365561373)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00383.jpeg)]
在本章中,您学习了如何对 Pandas 对象执行数值和统计分析。 这包括检查许多常用方法,这些方法将用于计算值和执行各种分析。 我们从基本的算术运算以及数据对齐如何影响运算和结果开始。 然后,我们介绍了 Pandas 提供的许多统计操作,从描述性统计到离散化再到滚动窗口和随机抽样。 这些课程将为您进行许多实际数据分析做好准备。
在下一章中,我们将进行调整,并研究如何从各种数据源(例如本地文件,数据库和远程 Web 服务)中加载数据。
在几乎所有实际数据分析中,您都需要从程序外部加载数据。 由于 pandas 是基于 Python 构建的,因此您可以使用 Python 中可用的任何方式来检索数据。 这样就可以从几乎无限的资源集中访问数据,包括但不限于文件,Excel 电子表格,网站和服务,数据库以及云服务。
但是,使用标准 Python 函数加载数据时,需要将 Python 对象转换为 Pandas Series
或DataFrame
对象。 这增加了代码的复杂性。 为了帮助管理这种复杂性,pandas 提供了许多功能,可以将各种来源的数据直接加载到 pandas 对象中。 我们将在本章中研究其中的许多内容。
具体而言,在本章中,我们将介绍:
我们从 Pandas 的标准导入和选择导入,以方便举例说明。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5eIIkYB3-1681365561373)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00384.jpeg)]
CSV 格式的数据可能是您可能在 Pandas 中使用的最常见的数据形式之一。 许多基于 Web 的服务以 CSV 格式提供数据,以及企业内的许多信息系统。 它是一种易于使用的格式,通常用作电子表格应用(例如 Excel)的导出格式。
CSV 是由多行基于文本的数据组成的文件,其值用逗号分隔。 可以将其视为类似于电子表格程序中单个工作表的数据表。 数据的每一行都在文件中自己的一行中,每一行的每一列都以文本格式存储,并用逗号分隔每一列中的数据。
有关 CSV 文件的详细信息,请随时访问这里。
由于 CSV 非常普遍且易于理解,因此我们将花费大部分时间来描述如何以这种格式读取和写入 Pandas 数据。 从 CSV 方法学到的经验教训也将适用于其他格式,并且在涵盖这些其他格式时可以更加方便。
我们将从读取一个简单的 CSV 文件data/msft.csv
(在本书的源代码data
文件夹中)开始。 该文件是MSFT
股票代码的股票值的快照。 可以使用!head
命令检查此文件的前几行(在 Windows 系统上,使用type
命令):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-35M3xrwF-1681365561373)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00385.jpeg)]
文件的第一行包含数据中表示的所有列的名称,每个列均以逗号分隔。 然后,每一行代表特定日期的值的样本。
data/MSFT.CSV
中的数据非常适合读入DataFrame
。 它的所有数据都是完整的,并且在第一行中具有列名。 将数据读入DataFrame
所需要做的就是使用 Pandas pd.read_csv()
函数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Dlt9Iot-1681365561374)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00386.jpeg)]
哇,那很容易! Pandas 已经意识到,文件的第一行包含列名和从数据中批量读取到数据帧的名称。
在前面的示例中,索引是数字的,从0
开始,而不是按日期。 这是因为 pandas 并不假定文件中的任何特定列都应用作索引。 为了解决这种情况,您可以使用index_col
参数,通过为它指定要用作索引的列的从零开始的位置,来指定在read_csv()
调用中哪些列应该是索引。
以下内容读取数据,并告诉 Pandas 使用文件中0
位置的列作为索引(Date
列):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xpQbvws0-1681365561374)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00387.jpeg)]
检查每一列的类型表明,pandas 试图从其内容中推断出列的类型:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QWH8E5VA-1681365561374)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00388.jpeg)]
要强制使用列的类型,请使用pd.read_csv()
的dtypes
参数。 以下命令将Volume
列也设置为float64
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jDLwVgT9-1681365561374)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00389.jpeg)]
也可以使用names
参数在读取数据时指定列名称:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fEkl6x2K-1681365561375)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00390.jpeg)]
由于我们指定了列名,因此我们需要跳过文件中的“列名”行,该行是使用header=0
执行的。 如果不这样做,Pandas 将假定第一行是数据的一部分,这将在以后的处理中引起一些问题。
还可以指定读取文件时要加载的列。 如果文件中有很多列,而您对分析不感兴趣,并且您希望节省读取和存储它们所需的时间和内存,这将很有用。 使用usecols
参数指定要读取的列,可以将其传递给列名称或列偏移量列表。
为了演示,以下仅读取Date
和Close
列,并使用Date
作为索引:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sHyJAJkS-1681365561375)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00391.jpeg)]
可以使用.to_csv()
方法从DataFrame
保存 CSV 文件。 为了演示如何将数据保存到 CSV 文件,我们将带有修改后的列名的df2
对象保存到名为data/msft_modified.csv
的新文件中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-18O2GkqC-1681365561375)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00392.jpeg)]
有必要告诉方法使用index_label='date'
将索引标签保存为date
的列名。 否则,索引不会在文件的第一行中添加名称,这将导致难以正确读取。
为了检查它是否正常工作,我们可以使用!head
命令浏览新文件以查看其某些内容(如果在 Windows 系统上,请使用!type
命令):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NGWe5ciD-1681365561376)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00393.jpeg)]
CSV 实际上是所谓的字段分隔数据的特定实现。 在以字段分隔的数据中,每行中的项目由特定符号分隔。 就 CSV 而言,它恰好是逗号。 但是,其他符号也很常见,例如|
(管道)符号。 使用|
字符时,该数据通常称为管道分隔的数据。
Pandas 提供pd.read_table()
函数,以方便读取字段分隔的数据。 下面的示例使用此函数通过将逗号指定为sep
参数的值来读取data/MSFT.CSV
文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1f6kd9ZV-1681365561376)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00394.jpeg)]
Pandas 没有提供.to_table()
方法作为.to_csv()
的类似写入方法。 但是,可以使用.to_csv()
方法使用与逗号不同的分隔符来写入字段分隔的数据。 例如,以下内容将写入数据的管道分隔版本:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XtzXVMtd-1681365561376)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00395.jpeg)]
字段分隔文件中的数据可能包含无关的页眉和页脚。 示例包括顶部的公司信息,例如发票编号,地址和摘要页脚。 在某些情况下,数据每隔一行存储一次。 这些情况在加载数据时会导致错误。 为了处理这些情况,Pandas pd.read_csv()
和pd.read_table()
方法具有一些有用的参数来帮助我们。
为了演示,对MSFT
股票数据进行以下变体,该数据具有多余的行,这些行可以称为噪声信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rjt49hqR-1681365561376)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00396.jpeg)]
可以使用skiprows
参数来处理这种情况,该参数通知 Pandas 跳过0
,2
和3
行:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZTEuQpM-1681365561377)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00397.jpeg)]
另一个常见情况是文件的内容位于文件末尾,应将其忽略以防止出错。 以以下数据为例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Grp0Uz3q-1681365561377)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00398.jpeg)]
该文件将在读取过程中导致异常,但是可以使用skip_footer
参数来处理,该参数指定要忽略文件末尾的多少行:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NRkBeSYC-1681365561377)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00399.jpeg)]
注意,我们必须指定engine = 'python'
。 至少对于 Anaconda,如果没有此选项,则会给出警告,因为默认的底层 C 实现未实现此选项。 这迫使它使用 Python 实现。
假设文件很大,您只想读取前几行,因为您只希望数据位于文件的开头,而不希望将其全部读取到内存中。 可以使用nrows
参数来处理:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ms6B5xxE-1681365561377)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00400.jpeg)]
您也可以在文件的开头跳过特定数量的行,然后读取到末尾,或者一旦到达文件中的该点,您就只能读取几行。 为此,请使用skiprows
参数。 以下示例跳过100
行,然后读取下一个5
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZYMa0KER-1681365561378)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00401.jpeg)]
前面的示例还跳过了标题行的读取,因此有必要通知该过程不要查找标题并使用指定的名称。
Pandas 支持使用pd.read_excel()
函数或通过ExcelFile
类读取 Excel 2003 及更高版本的数据。 在内部,这两种技术都使用XLRD
或OpenPyXL
包,因此您需要确保其中之一已安装在 Python 环境中。
为了演示,示例数据提供了一个data/stocks.xlsx
文件。 如果在 Excel 中打开它,您将看到与以下屏幕截图类似的内容:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NNuRrCoG-1681365561378)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00402.jpeg)]
该工作簿包含两张表,msft
和aapl
,它们分别保存了每种股票的股票数据。
然后,以下代码将data/stocks.xlsx
文件读入DataFrame
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Owzh2g4R-1681365561378)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00403.jpeg)]
该文件仅读取 Excel 文件(msft
工作表)中第一工作表的内容,并将第一行的内容用作列名。 要阅读其他工作表,可以使用sheetname
参数传递工作表的名称:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BdgP9GJe-1681365561378)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00404.jpeg)]
与pd.read_csv()
一样,对列名,数据类型和索引也有许多假设。 我们为pd.read_csv()
涵盖的所有用于指定此信息的选项,也适用于pd.read_excel()
函数。
可以使用DataFrame
的.to_excel()
方法编写 Excel 文件。 写入 XLS 格式要求包含XLWT
包,因此在尝试之前,请确保已将其加载到 Python 环境中。
以下将我们刚刚获取的数据写入stocks2.xls
。 默认值是将DataFrame
存储在Sheet1
工作表中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udoXdBQ6-1681365561379)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00405.jpeg)]
在 Excel 中打开它会显示以下内容:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r2LYZEAN-1681365561379)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00406.jpeg)]
您可以使用sheet_name
参数指定工作表的名称:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zGVbJROW-1681365561379)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00407.jpeg)]
在 Excel 中,我们可以看到该工作表已命名为MSFT
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uMTJDPHl-1681365561380)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00408.jpeg)]
要使用单独工作表上的每个DataFrame
对象将多个DataFrame
写入单个 Excel 文件,请使用ExcelWriter
对象以及with
关键字。 ExcelWriter
是 Pandas 的一部分,但您需要确保将其导入,因为它不在 Pandas 的顶级命名空间中。 下面的代码将两个DataFrame
对象写入一个 Excel 文件中的两个不同的工作表:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fUhrBBh5-1681365561380)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00409.jpeg)]
我们可以看到 Excel 文件中有两个工作表:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LqkUaRUf-1681365561380)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00410.jpeg)]
写入 XLSX 文件使用相同的功能,但将.XLSX
指定为文件扩展名:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4GRnv4By-1681365561381)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00411.jpeg)]
Pandas 可以读写以 JavaScript 对象表示法(JSON)格式存储的数据。 这是我的最爱之一,因为它具有跨平台和多种编程语言使用的能力。
为了演示如何保存为 JSON,我们将首先将刚刚读取的 Excel 数据保存到 JSON 文件中,然后检查其内容:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wWg1Qc0D-1681365561381)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00412.jpeg)]
可以使用pd.read_json()
函数读取基于 JSON 的数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BV0Js2Vg-1681365561381)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00413.jpeg)]
请注意此处的两个细微差异,这是由于从 JSON 读取/写入数据引起的。 首先,这些列已按字母顺序重新排序。 其次,DataFrame
的索引尽管包含内容,但仍按字符串排序。 这些问题很容易解决,但为简洁起见,此处不再赘述。
Pandas 支持从 HTML 文件(或 URL 的 HTML)读取数据。 在封面的下方,Pandas 使用LXML
,Html5Lib
和BeautifulSoup4
包。 这些包提供了一些令人印象深刻的读取和写入 HTML 表的功能。
您的 Anaconda 默认安装可能不包括这些包。 如果使用此功能遇到错误,请使用 Anaconda Navigator 根据错误安装适当的库:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tXksZBTb-1681365561381)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00414.jpeg)]
另外,您可以使用pip
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dHKZoiS9-1681365561382)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00415.jpeg)]
pd.read_html()
函数将从文件(或 URL)读取 HTML,并将内容中找到的所有 HTML 表解析为一个或多个 Pandas DataFrame
对象。 该函数始终返回DataFrame
对象的列表(实际上,为零或更多,取决于在 HTML 中找到的表的数量)。
为了演示,我们将从 FDIC 失败银行列表中读取表数据。 查看页面,您会看到有很多失败银行的列表。
实际上,使用 Pandas 及其pd.read_html()
函数可以很容易地读取这些数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OpCTV3Iq-1681365561382)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00416.jpeg)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qdf84V5J-1681365561382)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00417.jpeg)]
再次,那几乎太容易了!
可以使用.to_html()
方法将DataFrame
写入 HTML 文件。 此方法创建一个仅包含数据的<table>
标签(而不是整个 HTML 文档)的文件。 以下内容将我们之前阅读的股票数据写入 HTML 文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hcjyRW8y-1681365561383)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00418.jpeg)]
在浏览器中查看此结果类似于以下屏幕快照所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zxHnq79j-1681365561383)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00419.jpeg)]
这很有用,因为您可以使用 Pandas 编写要包含在网站中的 HTML 片段,并在需要时对其进行更新,从而使新数据静态地可供网站使用,而不必通过更复杂的数据查询或服务调用。
HDF5 是用于存储和管理数据的数据模型,库和文件格式。 它通常用于科学计算环境。 它支持无限多种数据类型,专为灵活高效的 I/O 以及大容量和复杂数据而设计。
HDF5 具有可移植性和可扩展性,从而允许应用在使用 HDF5 时不断发展。 HDF5 技术套件包括用于管理,操纵,查看和分析 HDF5 格式数据的工具和应用。 HDF5 是:
HDFStore
是类似于字典的分层对象,可将 Pandas 对象读取和写入 HDF5 格式。 在幕后,HDFStore
使用PyTables
库,因此,如果要使用此格式,请确保已安装该库。
以下演示将DataFrame
写入 HDF5 格式。 输出显示 HDF5 存储有一个名为df
的根级对象,该对象是DataFrame
,其形状是八行三列:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Bu2ZlW6-1681365561383)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00420.jpeg)]
以下内容读取 HDF5 存储并检索DataFrame
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IX961viJ-1681365561383)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00421.jpeg)]
DataFrame
在分配给存储对象的点写入 HDF5 文件。 此后对DataFrame
所做的更改将不会保留,至少要等到该对象再次分配给数据存储对象后才能保留。 下面通过更改DataFrame
,然后将其重新分配给 HDF5 存储,从而更新数据存储来演示此操作:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u9ReSLgO-1681365561384)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00422.jpeg)]
从网络和互联网读取数据非常普遍。 Pandas 使从网络读取数据变得容易。 还可以为我们检查的所有 Pandas 函数提供一个 HTTP URL,FTP 地址或 S3 地址,而不是本地文件路径,并且它们的全部功能与处理本地文件的方式相同。
以下内容演示了使用现有的pd.read_csv()
函数直接发出 HTTP 请求是多么容易。 以下内容通过其 HTTP 查询字符串模型直接从 Google 财经网络服务检索 Microsoft 在 2017 年 4 月的每日股票数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7CeZwkhc-1681365561384)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00423.jpeg)]
Pandas 可以从任何支持遵守 Python DB-API 的 Python 数据适配器的 SQL 数据库读取数据。 使用pandas.io.sql.read_sql()
函数执行读取,并使用DataFrame
的.to_sql()
方法完成对 SQL 数据库的写入。
为了演示,以下内容从msft.csv
和aapl.csv
中读取股票数据。 然后,它与 SQLite3 数据库文件建立连接。 如果该文件不存在,则会动态创建。 然后将MSFT
数据写入名为STOCK_DATA
的表中。 如果该表不存在,那么也会创建它。 如果确实存在,则将所有数据替换为MSFT
数据。 最后,然后将AAPL
股票数据附加到该表:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z4AOmEfY-1681365561384)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00424.jpeg)]
为了证明已创建此数据,可以使用诸如 SQLite 数据浏览器之类的工具打开数据库文件。 以下屏幕截图显示了数据库文件中的几行数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CBgOOLnC-1681365561384)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00425.jpeg)]
可以使用 SQL 使用pd.io.sql.read_sql()
函数从数据库中读取数据。 以下内容演示了如何使用 SQL 查询stocks.sqlite
中的数据并将其报告给用户:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MZEHTJI5-1681365561385)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00426.jpeg)]
也可以在 SQL 中使用WHERE
子句以及选择列。 为了演示,以下选择MSFT
的容量大于29200100
的记录:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hg1XBlbh-1681365561385)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00427.jpeg)]
最后一点是,这些示例中的大多数代码是 SQLite3 代码。 这些示例中唯一的 Pandas 部分是.to_sql()
和.read_sql()
方法的使用,因为这些函数采用一个连接对象,该对象可以是任何与 Python DB-API 兼容的数据适配器,您可以或多或少地使用任何受支持的数据库来处理数据,只需创建适当的连接对象即可。 对于任何受支持的数据库,Pandas 级别的代码应保持相同。
0.19.0 之前的 Pandas 在pandas.io.data
名称空间中直接支持各种基于 Web 的数据源类。 这已经发生了变化,因为功能已从 Pandas 中重构出来并放入pandas-datareader
包中。
该包提供对许多有用数据源的访问,包括:
请注意,由于这些数据来自外部数据源,并且实际值会随时间变化,因此,当您运行代码时,可能会获得与本书中不同的值。
首先,我要说的很遗憾,Yahoo 已更改了他们的 API,目前这破坏了pandas-datareader
中的实现。 不知道这是否会解决。 因此,这些示例将仅使用 Google 财经。
要使用pandas-datereader
包,我们使用以下导入:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jpl0usgp-1681365561385)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00428.jpeg)]
然后,可以使用DataReader
函数来反对来自 Google 财经的股票数据,方法是向其传递股票代码,数据源(在本例中为'google'
)以及开始日期和结束日期:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5STL7V3l-1681365561385)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00429.jpeg)]
Pandas 提供实验支持,可通过Options
类检索 Google 财经期权数据。 在以下示例中,.get_all_data()
方法用于从 Google 下载AAPL
的选项数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nYkCuWX1-1681365561386)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00430.jpeg)]
使用此结果,可以通过使用.expiry_dates
属性来确定到期日期:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xhPbSqzi-1681365561386)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00431.jpeg)]
使用.get_options_data()
读取实际数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q4WSwGNZ-1681365561386)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00432.jpeg)]
生成的DataFrame
对象包含一个层次结构索引,可用于轻松提取数据的特定子集。 为了演示,让我们研究几个使用索引对值进行切片的示例。
以下将以Strike
价格为 30 美元返回所有put
选项。 使用slice(None)
作为用于按索引选择的元组中的值之一,将包含所有Expiry
日期:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VDhPdpk2-1681365561386)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00433.jpeg)]
我们可以通过指定日期切片而不是slice(None)
来缩小日期范围。 以下将结果缩小到Expiry
日期在2015-01-17
和2015-04-17
之间的日期:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KDR4jwYe-1681365561387)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00434.jpeg)]
圣路易斯的美联储经济数据(FRED)可从超过 76 个数据源中下载超过 240,000 个美国和国际时间序列,并且它还在不断增长。
可以通过使用FredReader
类并通过将特定序列标签作为name
参数来指定 FRED 数据。 例如,以下内容检索两个指定日期之间的 GDP 信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4OX1Bxjz-1681365561387)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00435.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JmYGZOL8-1681365561387)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00436.jpeg)]
要选择另一个序列,只需在第一个参数中指定序列标识符。 可以方便地在网站上浏览序列和直接在网站上可视化的数据。 例如,以下屏幕截图显示了“雇员补偿”序列:工资和薪金:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NPZQO530-1681365561388)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00437.jpeg)]
该数据序列由A576RC1A027NBEA
ID 表示,我们可以使用以下代码下载它:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kei6kRZn-1681365561388)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00438.jpeg)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EaHxHTWn-1681365561388)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00439.jpeg)]
Kenneth R. French 是达特茅斯大学塔克商学院金融学教授。 他创建了一个广泛的经济数据库,可通过 Web 下载。 其数据的网站包含数据集。
该站点上可用的数据可通过 ZIP 文件下载,并且可以通过指定数据集的文件名(不带.zip
)并使用FameFrenchReader
函数直接读取到数据帧中。 例如,以下内容读取全局因子数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oi5YaKBL-1681365561388)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00440.jpeg)]
世界银行有成千上万的数据提要,可以直接将其读入 Pandas DataFrame
对象中。 可以在 http://www.worldbank.org/
浏览世界银行数据目录。
世界银行的数据集使用指示符进行标识,指示符是代表每个数据集的文本代码。 可以使用pandas.io.wb.get_indicators()
函数检索指标的完整列表。 在撰写本文时,共有 16,167 个指标。 以下内容检索指标并显示前五个指标:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VqPR3vJO-1681365561389)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00441.jpeg)]
可以使用世界银行的网站对这些指标进行调查,但是,如果您想了解要采样的指标,则只需进行搜索即可。 例如,以下使用wb.search()
函数来搜索具有与预期寿命相关的数据的指标:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H61V6JUO-1681365561389)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00442.jpeg)]
每个指标均分为不同的国家。 可以使用wb.get_countries()
函数检索国家/地区数据的完整列表:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q2TbJnK3-1681365561389)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00443.jpeg)]
可以使用wb.download()
函数并使用indicator
参数指定数据集来下载指标数据。 以下是从1980
到2014
下载国家的预期寿命数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8MMU5sj6-1681365561389)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00444.jpeg)]
默认情况下,仅返回美国,加拿大和墨西哥的数据。 通过检查上一个查询的结果索引可以看出这一点:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7IS0Wj1d-1681365561390)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00445.jpeg)]
要获取更多国家的数据,请使用country
参数明确指定它们。 以下获取所有已知国家/地区的数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d8tHEyzw-1681365561390)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00446.jpeg)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XiPURIn3-1681365561390)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00447.jpeg)]
我们可以用这些数据做一些有趣的事情。 我们将看的示例确定哪个国家的预期寿命最低。 为此,我们首先需要对数据进行透视处理,以使索引为国家名称,而年份为列。 我们将在后面的章节中更详细地介绍数据透视,但是目前,仅知道以下内容将数据沿索引和跨列的年份重新组织到了国家/地区中。 同样,每个值都是每个国家在特定年份的预期寿命:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-we5pffmo-1681365561390)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00448.jpeg)]
使用这种格式的数据,我们可以使用.idxmin(axis=0)
确定哪个国家的预期寿命最低:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CJSANpAZ-1681365561390)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00449.jpeg)]
每年的实际最小值可以使用.min(axis=0)
检索:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vh10NkuW-1681365561391)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00450.jpeg)]
然后,可以将这两个结果合并为一个新的DataFrame
,该值告诉我们哪个国家/地区的预期寿命最短,其值是多少:
在本章中,我们研究了 Pandas 如何使访问各种位置和格式的数据变得简单,如何将这些格式的数据自动映射到数据帧对象。 我们从学习如何从 CSV,HTML,JSON,HDF5 和 Excel 格式的本地文件中读取和写入数据开始,直接读取和写入数据帧对象,而不必担心将包含的数据映射到这些各种数据中的细节。 格式。
然后,我们研究了如何从远程源访问数据。 首先,我们看到与本地文件配合使用的功能和方法也可以从 Web 和云数据源中读取。 然后,我们研究了 Pandas 对访问各种形式的基于 Web 和基于 Web 服务的数据的支持,例如 Yahoo 金融和世界银行。
既然我们已经能够加载数据,那么使用它的下一步就是执行数据的清理,因为通常情况下,检索到的数据存在诸如信息丢失和内容格式错误的问题。 下一章将集中在整理数据的过程中,这些问题通常称为整理你的数据。
我们现在在数据处理管道中,需要查看我们检索到的数据并解决在分析过程中可能出现的异常现象。 这些异常可能由于多种原因而存在。 有时,某些数据部分未记录或丢失。 也许有些单位与您系统的单位不匹配。 很多时候,某些数据点可以重复。
这种处理异常数据的过程通常称为整理您的数据,您会发现该术语在数据分析中使用了很多次。 这是管道中非常重要的一步,在进行简单分析之前,它可能会花费大量时间。
整理数据可能是一个单调乏味的问题,尤其是在使用不是为特定数据清理任务而设计的编程工具时。 对我们来说幸运的是,Pandas 拥有许多可用于解决这些问题的工具,同时也可以帮助我们提高效率。
在本章中,我们将介绍整理数据涉及的许多任务。 具体来说,您将学习:
NaN
值本章中的示例使用以下 pandas 和 Jupyter 配置:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eTiA7Bxz-1681365561391)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00451.jpeg)]
整洁的数据是 Hadley Wickham 在名为“整洁的数据”的论文中创造的术语。 我强烈建议您阅读本文。 可以从这里下载。
本文涵盖了创建整洁数据的过程的许多细节,最终结果是您拥有的数据毫无意外,可以进行分析。
我们将研究 Pandas 中用于整理数据的许多工具。 存在这些是因为我们需要处理以下情况:
这是一个完整的列表,我向您保证它不完整。 但这都是我个人遇到的所有问题(而且我敢肯定,您也会遇到)。 当使用未明确构建的工具和语言来处理这些问题时(例如 Pandas),它们很难解决。 在本章中,我们将研究用 Pandas 解决这些问题有多么容易。
当数据的NaN
值(也称为np.nan
– 来自 NumPy 的形式)时,Pandas 中的缺少。 该NaN
值意味着在特定的Series
中没有为特定的索引标签指定值。
数据如何丢失? 值可以为NaN
的原因有很多:
NaN
值未知,稍后会填充让我们开始研究如何通过创建具有一些缺失数据点的数据帧来处理缺失数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-crIiptjS-1681365561391)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00452.jpeg)]
这里不缺少任何数据,所以我们添加一些:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aZotCWTP-1681365561391)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00453.jpeg)]
该DataFrame
现在缺少显示以下特征的数据:
NaN
值组成NaN
值组成NaN
值组成的几行和几列NaN
值可以使用.isnull()
方法识别DataFrame
对象中的NaN
值。 任何True
值表示该位置处的项目是NaN
值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CHc5YBJd-1681365561392)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00454.jpeg)]
我们可以使用.sum()
方法将True
视为 1 并将False
视为 0 的事实来确定DataFrame
对象中NaN
值的数量:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LGeBqnUP-1681365561392)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00455.jpeg)]
将.sum()
应用于结果序列,可得出原始DataFrame
对象中NaN
值的总数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SuWCYgMf-1681365561392)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00456.jpeg)]
这很棒,因为它可以很容易地识别出流程早期是否丢失了数据。 如果您希望数据是完整的,并且此简单检查将得出一个非 0 的值,那么您就需要更深入地了解。
另一种确定方法是使用Series
对象和DataFrame
的.count()
方法。 对于Series
方法,此方法将返回非NaN
值的数量。 对于DataFrame
对象,它将在
每列中计算非NaN
值的数量:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8yEPLcB8-1681365561392)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00457.jpeg)]
然后需要将其翻转以求和NaN
值的数量,该值可以如下计算:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ArWgdBLj-1681365561392)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00458.jpeg)]
我们还可以使用.notnull()
方法确定某项是否不是NaN
,如果该值不是NaN
值,则该方法返回True
。 否则,返回False
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dgfa6ydF-1681365561393)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00459.jpeg)]
处理缺失数据的一种技术是简单地将其从数据集中删除。 这种情况的一种情况是,以固定的时间间隔对数据进行采样,但是设备处于脱机状态,因此不会记录读数。
Pandas 库使用多种技术使之成为可能。 一种是通过使用.isnull()
或.notnull()
的结果进行布尔选择来从Series
对象中检索NaN
或非NaN
的值。 以下示例演示了从DataFrame
的c4
列中选择所有非NaN
值的方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m1VopDbz-1681365561393)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00460.jpeg)]
Pandas 还提供了一个便捷函数.dropna()
,该函数将这些项放置在Series
中,其值为NaN
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9zHm6pw1-1681365561393)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00461.jpeg)]
请注意,.dropna()
实际上返回了DataFrame
的副本,但没有行。 原始的DataFrame
不变:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tIfAWKGD-1681365561393)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00462.jpeg)]
将.dropna()
应用于DataFrame
对象时,它将删除DataFrame
对象中具有至少一个NaN
值的所有行。 下面的代码演示了此操作,并且由于每一行至少具有一个NaN
值,因此结果中有零行:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0FGBqlqz-1681365561394)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00463.jpeg)]
如果只想删除所有值均为NaN
的行,则可以使用how='all'
参数。 以下示例仅删除g
行,因为它具有所有NaN
值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-49nZVec2-1681365561394)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00464.jpeg)]
通过将axis
参数更改为axis=1
,这也可以应用于列而不是行。 以下内容删除了c5
列,因为它是唯一具有所有NaN
值的列:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rAxJRdao-1681365561394)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00465.jpeg)]
现在,我们使用稍微不同的DataFrame
对象检查该过程,该对象的列c1
和c3
的所有值都不为NaN
。 在这种情况下,将删除c1
和c3
以外的所有列:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6iJEylXM-1681365561395)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00466.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vj9KOoGN-1681365561395)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00467.jpeg)]
.dropna()
方法还具有参数thresh
,该参数在给定整数值时,指定执行删除之前必须存在的NaN
值的最小数量。 以下代码删除所有具有至少五个NaN
值的列(在这种情况下,这是c4
和c5
列):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YHb9doiS-1681365561395)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00468.jpeg)]
再次注意,.dropna()
方法(和布尔选择)返回DataFrame
对象的副本,并且数据从该副本中删除。 如果要将数据放入实际的DataFrame
中,请使用inplace=True
参数。
NaN
值在 Pandas 中的处理方式与在 NumPy 中的处理方式不同。 我们已经在较早的章节中看到了这一点,但是在这里值得重新讨论。 使用以下示例对此进行演示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2KYpiLsk-1681365561395)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00469.jpeg)]
当 NumPy 函数遇到NaN
值时,它返回NaN
。 Pandas 函数通常会忽略NaN
值,并继续处理该函数,就好像NaN
值不属于Series
对象的一部分一样。
请注意,先前序列的平均值计算为(1 + 2 + 3) / 3 = 2
,而不是(1 + 2 + 3) / 4
或(1 + 2 + 0 + 4) / 4
。 这验证了NaN
被完全忽略,甚至没有被计为Series
中的项目。
更具体地说,Pandas 处理NaN
值的方式如下:
NaN
视为 0NaN
,则结果为NaN
.cumsum()
和.cumprod()
这样的方法会忽略NaN
值,但会将它们保留在结果数组中下面演示了所有这些概念:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4UY2FiMS-1681365561396)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00470.jpeg)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MiAI23WE-1681365561396)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00471.jpeg)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ftj2mohT-1681365561396)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00472.jpeg)]
但是,当使用传统的数学运算符时,NaN
将传播到结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rWAdDC10-1681365561396)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00473.jpeg)]
.fillna()
方法可用于将NaN
值替换为特定值,而不是传播或忽略它们。 下面通过用0
填充NaN
值来说明这一点:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ceW7rlAa-1681365561397)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00474.jpeg)]
请注意,这会导致结果值有所不同。 例如,以下代码显示了将.mean()
方法应用于具有NaN
值的DataFrame
对象的结果,与DataFrame
对象的NaN
值填充有0
的结果相比 :
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Q2ysG7L-1681365561397)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00475.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k1KE4QxZ-1681365561397)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00476.jpeg)]
可以通过沿Series
向前或向后传播非NaN
值来填充数据中的间隙。 为了演示,以下示例将向前填充到DataFrame
的c4
列:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1wmp39lg-1681365561397)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00477.jpeg)]
使用时间序列数据时,这种填充技术通常称为“最新已知值”。 我们将在有关时间序列数据的章节中对此进行重新讨论。
可以使用method='bfill'
反转填充方向:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UeMLtq9z-1681365561398)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00478.jpeg)]
为了省去打字的麻烦,Pandas 还具有全局级别的函数pd.ffill()
和pd.bfill()
,它们等效于.fillna(method="ffill")
和.fillna(method="bfill")
。
可以使用Series
的标签或 Python 字典的键填充数据。 这使您可以根据索引标签的值为不同的元素指定不同的填充值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FnOPG0DD-1681365561398)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00479.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0zUJv7Kz-1681365561398)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00480.jpeg)]
仅填充NaN
的值。 请注意,标签为a
的值不会更改。
另一种常见情况是用列的平均值填充一列中的所有NaN
值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RHhiiFIC-1681365561398)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00481.jpeg)]
这很方便,因为以这种方式替换的缺失值会使统计平均值偏离(如果插入 0 的话)较小。 在某些统计分析中,当使用 0 值的较大偏差会导致错误故障时,这可能是可以接受的。
DataFrame
和Series
都具有.interpolate()
方法,默认情况下,该方法执行缺失值的线性插值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EQsfk1mB-1681365561399)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00482.jpeg)]
插值的值是通过在NaN
值的任何序列之前和之后取第一个值,然后从头开始逐渐增加该值并替换为NaN
值来计算的。 在这种情况下,周围的值为 2.0 和 1.0,导致(2.0 - 1.0) / (5 - 1) = 0.25
,然后将其通过所有NaN
值递增地添加。
这个很重要。 想象一下,如果您的数据代表一组增加的值,例如白天的温度升高。 如果传感器在几个采样周期内停止响应,则可以通过内插法以较高的确定性推断出缺失的数据。 绝对比将值设置为 0 更好。
插值方法还可以指定特定的插值方法。 常用方法之一是使用基于时间的插值。 请考虑以下Series
日期和值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vfhYQy1y-1681365561399)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00483.jpeg)]
插值的先前形式导致以下结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G7OlgWjk-1681365561399)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00484.jpeg)]
由于在值2.0
和1.0
之间存在一个NaN
值,因此2014-02-01
的值计算为1.0 + (2.0 - 1.0) / 2 = 1.5
。
需要注意的重要一点是,该序列缺少2014-03-01
的条目。 如果我们希望对每日值进行插值,则应该计算两个值,一个用于2014-02-01
,另一个用于2014-03-01
,从而在插值分子中产生另一个值。
这可以通过将插值方法指定为time
来纠正:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wg3fQMIQ-1681365561399)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00485.jpeg)]
这是基于日期的2014-02-01
的正确插值。 另请注意,2014-03-01
的索引标签和值未添加到Series
; 它只是考虑在内插中。
当使用数字索引标签时,也可以指定插值来计算相对于索引值的值。 为了说明这一点,我们将使用以下Series
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zaMratUs-1681365561400)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00486.jpeg)]
如果执行线性插值,则将获得标签1
的以下值,该值对于线性插值是正确的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z0tzXIg2-1681365561400)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00487.jpeg)]
但是,如果我们想插值相对于索引值怎么办? 为此,我们可以使用method="values"
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Llg7Kjyp-1681365561400)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00488.jpeg)]
现在,基于索引中的标签,使用相对定位来插值NaN
的计算值。 NaN
值的标签为1
,是
的
的十分之一,因此插值将为0 + (100 - 0) / 10
或10
。
样本中的数据通常可以包含重复的行。 这只是处理自动收集的数据的现实,甚至是手动收集数据时创建的情况。 在这些情况下,通常认为最好是在具有重复项而不是缺失数据的方面出错,特别是如果可以认为数据是等幂的。 但是,重复数据会增加数据集的大小,并且如果不是幂等的,则不适合处理重复数据。
Pandas 提供了.duplicates()
方法,以方便查找重复数据。 此方法返回布尔值Series
,其中每个条目表示该行是否重复。 True
值表示特定行已早出现在DataFrame
对象中,所有列值均相同。
下面通过创建具有
个重复行的DataFrame
对象来演示此操作:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nIlrTQ0S-1681365561400)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00489.jpeg)]
现在让我们检查重复项:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S302D35a-1681365561401)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00490.jpeg)]
可以使用.drop_duplicates()
方法从DataFrame
中删除重复的行。 此方法返回DataFrame
的副本,其中删除了重复的行:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W5151uMw-1681365561401)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00491.jpeg)]
也可以使用inplace=True
参数删除行而不进行复制。
请注意,删除重复项时会保留索引。 重复记录可能具有不同的索引标签(在计算重复项时不考虑标签)。 因此,保留的行会影响结果DataFrame
对象中的标签集。
默认操作是保留重复项的第一行。 如果要
保留重复项的最后一行,请使用keep='last'
参数。
下面演示了使用此参数的结果如何不同:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sUB0YM56-1681365561401)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00492.jpeg)]
如果要基于较小的列集检查重复项,则可以指定列名列表:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qcFpnhRl-1681365561401)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00493.jpeg)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XZ4N06Br-1681365561401)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00494.jpeg)]
整理数据的另一部分涉及将现有数据转换为另一个表示形式。 由于以下原因,可能需要这样做:
为了解决这些情况,我们可以采取以下一项或多项措施:
我们已经了解了如何使用几种技术删除行和列,因此在此不再赘述。 现在,我们将介绍 Pandas 提供的用于根据其内容映射,替换和函数应用来转换数据的功能。
数据转换的基本任务之一是将一组值映射到另一组。 Pandas 提供了使用.map()
方法使用查找表(通过 Python 字典或 Pandas Series
)来映射值的通用功能。
该方法通过首先将外部Series
的值与内部Series
的索引标签进行匹配来执行映射。 然后,它返回一个新的Series
,带有外部Series
的索引标签,但具有内部Series
的索引标签。
下面的示例显示如何将x
索引中的标签映射到y
的值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TwncDwgq-1681365561402)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00495.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ac3usscm-1681365561402)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00496.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5p5441zm-1681365561402)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00497.jpeg)]
与其他对齐操作一样,如果 Pandas 未在外部Series
的值和内部Series
的索引标签之间找到映射,则它将NaN
填充该值。 为了演示,以下操作从外部Series
删除了3
键,这导致该记录的对齐失败,并导致引入了NaN
值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nxuoOUQ9-1681365561402)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00498.jpeg)]
前面我们已经看到了如何使用.fillna()
方法用您自己决定的值替换NaN
值。 实际上,可以将.fillna()
方法视为将单个值NaN
映射到特定值的.map()
方法的实现。
甚至更笼统地说,.fillna()
方法本身可以被认为是.replace()
方法提供的更通用替代品的专业化。 通过能够用另一个值替换任何值(不仅是NaN
),此方法提供了更大的灵活性。
.replace()
方法的最基本用途是将另一个值
替换为另一个值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I4l1tb5E-1681365561402)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00499.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l6tFpSoq-1681365561403)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00500.jpeg)]
还可以指定多个要替换的项目,还可以通过传递两个列表(第一个要替换的值,第二个要替换的值)来指定它们的替换值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c7WGwluI-1681365561403)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00501.jpeg)]
还可以通过指定用于查找的字典(上一部分中映射过程的变体)来执行替换:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-khhFfUAt-1681365561403)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00502.jpeg)]
如果在DataFrame
上使用.replace()
,则可以为每列指定不同的替换值。 这是通过将 Python 字典传递给.replace()
方法来执行的。 在此字典中,键表示要进行替换的列的名称,而字典的值指定要进行替换的位置。 方法的第二个参数是用于替换匹配项的值。
以下代码通过创建DataFrame
对象,然后将每个列中的特定值替换为 100 来说明这一点:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xXzDFnaP-1681365561403)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00503.jpeg)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w8DSZXNQ-1681365561403)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00504.jpeg)]
替换每列中的特定值非常方便,因为它为否则需要编码遍历所有列的循环提供了快捷方式。
也可以替换特定索引位置的项目,就像它们缺少值一样。 以下代码通过将索引位置0
处的值向前填充到位置1
,2
和3
中来演示此操作:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8wC0NJzk-1681365561404)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00505.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eDOGmcQt-1681365561404)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00506.jpeg)]
也可以通过使用ffill
和bfill
作为指定方法来向前和向后填充,但是这些都是练习,您可以自己尝试。
在直接映射或替换无法满足要求的情况下,可以将函数应用于数据以对数据执行算法。 Pandas 提供了将函数应用于单个项目,整个列或整个行的功能,从而为转换提供了难以置信的灵活性。
可以使用方便命名的.apply()
方法来应用函数。 当给定 Python 函数时,此方法在从Series
传递每个值的同时迭代调用该函数。 如果将 Pandas 应用于DataFrame
,Pandas 将以Series
的形式通过每一列,或者如果沿着axis=1
进行 Pandas,则将以代表每一行的Series
形式通过。
下面通过对Series
的每个项目应用 lambda 函数来说明这一点:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uEo15LKX-1681365561404)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00507.jpeg)]
将函数应用于Series
中的项目时,仅每个Series
项目的值将传递给函数,而不是索引标签和值。
将函数应用于DataFrame
时,默认值为将方法应用于每一列。 Pandas 遍历所有列,并将每个列作为Series
传递给您的函数。 结果是一个Series
对象,其索引标签与列名称匹配,并且该函数的结果应用于该列:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WBuYhieI-1681365561404)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00508.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wmbEqMd-1681365561405)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00509.jpeg)]
通过指定axis=1
,可以将函数的应用切换为每一行的值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0kRRDZeY-1681365561405)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00510.jpeg)]
常见的做法是获取应用操作的结果并将其添加为DataFrame
的新列。 这很方便,因为您可以将一个或多个连续计算的结果添加到DataFrame
上,从而为自己提供过程每一步结果的渐进表示。
以下代码演示了此过程。 第一步将列a
与列b
相乘,并创建一个名为interim
的新列。 第二步,将这些值和列c
相加,并使用这些值创建result
列:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FlSiyYaP-1681365561405)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00511.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DXbMq5WV-1681365561405)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00512.jpeg)]
如果您想更改现有列中的值,只需将结果分配给现有列即可。 下面将a
列的值更改为该行中值的总和:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mzbG0nla-1681365561405)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00513.jpeg)]
实际上,用全新的值替换列并不是最好的处理方式,并且经常导致临时(甚至可能是永久性的)精神错乱,试图调试由缺失数据引起的问题。 因此,在 Pandas 中,最好只添加新的行或列(或全新的对象),并且如果以后内存或性能成为问题,请根据需要进行优化。
要注意的另一点是,Pandas DataFrame
不是电子表格,在电子表格中为单元分配了公式,并且当公式引用的单元发生更改时可以重新计算。 如果您希望这种情况发生,那么只要相关数据发生变化,就需要执行公式。 从另一方面来说,这比电子表格更有效,因为每个小的更改都不会引起一些操作。
.apply()
方法始终将提供的函数应用于Series
,列或行中的所有项目。 如果要将函数应用于这些序列的子集,请首先执行布尔选择以过滤不希望处理的项目。
下面通过创建值的DataFrame
并将一个NaN
值插入第二行来说明这一点。 然后,它仅将函数应用于所有值都不都是NaN
的那些行:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7MhErHPa-1681365561406)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00514.jpeg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ktR1MdYC-1681365561406)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00515.jpeg)]
我们将在本章中介绍的最后一种方法是使用DataFrame
的.applymap()
方法应用函数。 尽管.apply()
方法始终传递整个行或列,但.applymap()
函数将函数应用于每个值。
下面演示了通过使用.applymap()
方法将DateFrame
中的每个值格式化为指定的小数位数的实际用法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-exIcIo8V-1681365561406)(https://gitcode.net/apachecn/apachecn-ds-zh/-/raw/master/docs/learning-pandas-2e/img/00516.jpeg)]
在本章中,我们研究了整理数据的各种技术。 我们介绍了如何识别缺失的数据,将其替换为其他值,或者将其从整个数据集中删除。 然后,我们介绍了如何将值转换为更适合进一步分析的其他值。
现在,我们已经在数据帧或序列中整理了数据,我们希望从专注于数据的整洁度转向更精细的修改数据结构的形式,例如连接,合并,连接和数据透视。 这将是下一章的重点。