何时使用 pandas 系列、numpy ndarrays 或简单的 python 字典?

Posted

技术标签:

【中文标题】何时使用 pandas 系列、numpy ndarrays 或简单的 python 字典?【英文标题】:When to use pandas series, numpy ndarrays or simply python dictionaries? 【发布时间】:2017-12-30 08:14:57 【问题描述】:

我是学习 Python 及其一些库(numpy、pandas)的新手。

我找到了很多关于 numpy ndarray、pandas 系列和 python 字典如何工作的文档。

但由于我对 Python 缺乏经验,我很难确定何时使用它们中的每一个。而且我还没有找到任何最佳实践来帮助我理解和决定何时更好地使用每种类型的数据结构。

一般而言,是否有任何最佳实践来决定应将特定数据集加载到这三个数据结构中的哪个(如果有)?

谢谢!

【问题讨论】:

取决于哪些操作、方法、处理等...您需要将其应用于您的数据... 使用字典直到你得到不满意的结果。 由于您是 Python 新手,我建议您先获得更多核心 Python 的经验。然后,当您学习 Numpy 时,您会更好地了解 Numpy 如何位于 Python 生态系统之上。这反过来将帮助您了解 Pandas 如何位于核心 Python 和 Numpy 之上。 【参考方案1】:

我通常应用的经验法则:使用仍然满足您需求的最简单的数据结构。如果我们将数据结构从最简单到最不简单进行排序,通常会这样结束:

    字典/列表 Numpy 数组 熊猫系列/数据框

所以首先考虑字典/列表。如果这些允许您执行所需的所有数据操作,那么一切都很好。如果没有,请开始考虑 numpy 数组。迁移到 numpy 数组的一些典型原因是:

您的数据是二维(或更高)的。尽管可以使用嵌套字典/列表来表示多维数据,但在大多数情况下,numpy 数组会更高效。 您必须执行一堆数值计算。正如 zhqiat 已经指出的那样,在这种情况下,numpy 将显着加快速度。此外,numpy 数组还捆绑了大量 mathematical functions。

那么还有一些典型的原因需要超越 numpy 数组,转向更复杂但也更强大的 pandas 系列/数据框:

您必须将多个数据集相互合并,或者对数据进行整形/重新排序。 This diagram 很好地概述了 pandas 允许您执行的所有“数据整理”操作。 您必须从特定文件格式(如 Excel、HDF5 或 SQL)导入或导出数据。 Pandas 为此提供了方便的import/export functions。

【讨论】:

【参考方案2】:

如果你想得到一个告诉你只使用一种数据结构的答案,这里有一个:使用 pandas 系列/数据帧结构

pandas 系列对象可以看作是增强的 numpy 1D 数组,pandas 数据帧可以看作是增强的 numpy 2D 数组。主要区别在于 pandas 系列和 pandas 数据帧具有显式索引,而 numpy 数组具有隐式索引。所以,在任何你认为使用类似

的python代码中
import numpy as np
a = np.array([1,2,3])

你可以使用

import pandas as pd
a = pd.Series([1,2,3])

numpy 数组中的所有函数和方法都适用于 pandas 系列。以此类推,数据帧和 numpy 2D 数组也可以这样做。

您可能还有一个问题可能是关于 numpy 数组和 pandas 系列之间的性能差异。这是一篇展示使用这两种工具的性能差异的帖子:performance of pandas series vs numpy arrays。

请注意,与 numpy 相比,即使以明确的方式,pandas 系列的性能稍差,您只需在 pandas 系列上调用 values 方法即可解决此问题:

a.values

对 pandas 系列应用 values 方法的结果将是一个 numpy 数组!

【讨论】:

【参考方案3】:

Pandas 通常用于金融时间序列数据/经济数据(它有很多内置的助手来处理金融数据)。

Numpy 是处理用于科学计算的大型多维数组的快速方法(scipy 也有帮助)。它还可以轻松处理所谓的稀疏数组(其中包含很少数据的大型数组)。

numpy 的一个关键优势是 C 绑定,它允许在大型数组计算中大幅加速,以及一些内置函数,例如线性代数/信号处理能力。

这两个包都解决了一些由 python 的现有内置数据类型确定的缺陷。作为一般经验法则,对于不完整的现实世界数据(NaN、异常值等),您最终将需要编写所有类型的函数来解决这些问题;使用上述软件包,您可以在其他人的工作上进行构建。如果您的程序在内部为您的数据类型生成数据,您可能可以使用更简单的本机数据结构(不仅仅是 python 字典)。

查看 Pandas 作者的post 进行比较

【讨论】:

补充一下,根据我的经验,pandas 对于科学/工程应用也非常有用。【参考方案4】:

Numpy 处理数组、矩阵、数学的速度非常快。 Pandas 系列有索引,有时对数据进行排序或连接非常有用。 字典是一个缓慢的野兽,但有时它也很方便。 因此,正如已经提到的,这取决于用例使用哪些数据类型和工具。

【讨论】:

【参考方案5】:

我想说pandas 让您可以索引和分割字符串并直接从字典创建数据帧,而numpy 主要是嵌套列表。除此之外,它们几乎完全相同(pandas 建立在numpy 之上)。所以pandas“感觉”更自然地用于类似数据库的数据(例如 csv、excel 和 sql 文件),而numpy“感觉”更自然地用于数据的数字处理(例如信号、图像等) .当然,您可以在两个库中执行许多相同的操作;您甚至可以从 numpy 数组创建 pandas 数据帧,反之亦然。

一个主要区别(需要注意的一点)是pandas 中的切片是包容性的,而numpy 是独占性的(即pandas 中的0:10 是“0 到包括10”,而它是“0” numpy 中最多但不包括 10")。直观上这是因为pandas 允许对字符串进行切片,因此切片没有多大意义,例如“最多但不包括名称为 x 的列”(向 Corey Schafer 大喊洞察力(见大约 30 分钟):Python Pandas Tutorial (Part 2))。

除此之外,pandas 使用与numpy 相同的切片、索引和花哨的索引表示法(减去字符串的能力)以及关于创建视图和副本的不同操作的相同类型的“陷阱”数据。 (优秀的numpy 教程是a Numpy lecture from SciPy 2019 by Alex Chabot-Leclerc)。

最后,我想说pandas 是数据库分析师最好的朋友,而numpy 是数据科学家的朋友。就个人而言,我使用pandas 从现实世界中提取数据,对其进行排序和预处理。然后我将这些数据转换为numpy 数组,以便在必要时进行更严肃/密集的数值计算。 请注意:这纯粹是意见。没有正确答案。

话虽如此,我强烈建议先了解和了解numpy(强烈推荐Alex Chabot-Leclerc video)。之后,pandas 会更有意义。

【讨论】:

以上是关于何时使用 pandas 系列、numpy ndarrays 或简单的 python 字典?的主要内容,如果未能解决你的问题,请参考以下文章

将 pandas 系列的 numpy 矩阵转换为 Multiindex 系列

为啥 numpy 函数在 pandas 系列/数据帧上这么慢?

将 Pandas 系列导出为 JSON - numpy 类型错误

如何将一系列数组转换为 pandas/numpy 中的单个矩阵?

如何检查变量是 python 列表、numpy 数组还是 pandas 系列

Pandas系列教程:盛大开篇了!