Pandas(样式化为 pandas)是一个为 Python 编程语言编写的软件库,用于数据处理和分析。具体来说,它提供了用于操作数值表格和时间序列的数据结构与操作。它是一个自由软件,采用三条款 BSD 许可证发布。其名称来源于术语“面板数据”(panel data),这是一个计量经济学术语,指对同一对象在多个时间段进行观测的数据集;同时,它也是对“Python 数据分析”(Python data analysis)这一短语的巧妙双关。Wes McKinney 于 2007 年至 2010 年在 AQR Capital 担任研究员期间,开始构建后来成为 Pandas 的项目。
Pandas 的开发将 R 编程语言中许多与 DataFrame 相关的成熟功能引入了 Python。该库建立在另一个库 NumPy 之上。
历史
开发者 Wes McKinney 于 2008 年在 AQR Capital Management 工作时,出于对高性能、灵活工具的需求,开始开发 Pandas,以对金融数据进行定量分析。在离开 AQR 之前,他成功说服管理层允许他在 2009 年将该库开源。另一位 AQR 员工 Chang She 于 2012 年加入,成为该库的第二大贡献者。2015 年,Pandas 成为 NumFOCUS 的财政赞助项目,NumFOCUS 是美国的一家 501(c)(3) 非营利慈善机构。
数据模型
Pandas 围绕称为 Series 和 DataFrame 的数据结构构建。这些集合的数据可以从多种文件格式导入,例如逗号分隔值(CSV)、JSON、Parquet、SQL 数据库表或查询,以及 Microsoft Excel。
Series
Series 是一维的类数组对象,它存储一系列值,并附带一组称为索引的标签。它建立在 NumPy 数组之上,并提供许多类似的功能,但不同之处在于,Series 允许使用显式的索引标签,这些标签可以是多种数据类型,而不是使用隐式的整数位置。Series 可以从 Python 列表、字典或 NumPy 数组创建。如果未提供索引,pandas 会自动分配一个默认的整数索引,范围从 0 到 n-1,其中 n 是 Series 中的项数。
要从 Series 中访问一个值或值列表,可以使用其索引或索引列表。Series 可以进行算术运算,例如语句 series_3 = series_1 + series_2。这将根据 series_1 和 series_2 中对应的索引值对齐数据点,然后将它们相加,生成 series_3 中的新值。Series 具有多种属性,例如 name(名称)、dtype(值的数据类型)、shape(行数)、values(值)和 index(索引)。它们可以用于许多与 NumPy 数组相同的操作,并提供了额外的方法来处理重新索引、基于标签的选择以及缺失数据的处理。
DataFrame
DataFrame 是二维的表格数据结构,具有带标签的行和列。每一列在内部存储为一个 Series,并且可以包含不同的数据类型(数值、字符串、布尔值等)。DataFrame 可以通过多种方式创建,包括字典列表、NumPy 数组以及外部文件(如 CSV 或 Excel 电子表格)。要检索 DataFrame 的某一列作为 Series,可以使用索引(类似字典的表示法),或者如果列名是有效的 Python 标识符,也可以使用属性访问(类似属性的表示法)。DataFrame 支持多种操作,例如列赋值、行和列的删除、基于标签的索引(使用 loc)、基于位置的索引(使用 iloc)、重塑、分组和连接。合并操作实现了关系代数的一个子集,并支持一对一、多对一和多对多的连接。
DataFrame 的一些常见属性包括 dtypes(每列的数据类型)、shape(DataFrame 的维度,以元组形式返回,格式为(行数,列数))、index/columns(DataFrame 的行/列标签,分别作为 Index 对象返回)、values(DataFrame 中的数据,以二维数组形式返回)以及 empty(如果 DataFrame 为空,则返回 True)。
Index
Index 对象为 Series 和 DataFrame 对象持有元数据,例如轴标签和名称,并且会根据输入数据自动创建。默认情况下,pandas 索引是一个从 0 开始递增的整数序列,类似于 Python 数组的索引。然而,索引也可以使用任何 NumPy 数据类型,包括浮点数、时间戳或字符串。索引是不可变的,这使它们可以安全地在多个对象之间共享。
pandas 用于将索引值映射到相关数据的语法与 Python 用于将字典键映射到值的语法相同。例如,如果 s 是一个 Series,那么 s['a'] 将返回索引 a 处的数据点。与字典键不同,索引值不保证是唯一的。如果 Series 对多个数据点使用了索引值 a,那么 s['a'] 将返回一个包含所有匹配值的新 Series。DataFrame 的列名与索引的存储和实现方式相同。因此,DataFrame 可以被视为具有两个索引:一个基于列,一个基于行。由于列名作为索引存储,它们不要求是唯一的。
如果数据是一个 Series,那么 data['a'] 返回所有索引值为 a 的值。然而,如果数据是一个 DataFrame,那么 data['a'] 返回所有列名为 a 的值。为了避免这种歧义,Pandas 支持 data.loc['a'] 语法作为使用索引进行筛选的替代方式。Pandas 还支持 data.iloc[n] 语法,它始终接受一个整数 n,并返回第 n 个值(从 0 开始计数)。这允许用户将索引视为一个类数组的整数序列,无论其实际定义方式如何。
pandas 还通过“MultiIndex”类支持分层索引,即每个数据点可以有多个值。MultiIndex 对象允许单个 DataFrame 表示多维数据,类似于 Microsoft Excel 中的数据透视表,其中每个级别可以可选地具有自己的唯一名称。在实践中,具有超过 2 维的数据通常使用带有分层索引的 DataFrame 来表示,而不是使用更高维度的 Panel 和 Panel4D 数据结构。
功能
pandas 支持多种索引和子集选择技术,允许按标签、索引或布尔条件选择数据。例如,df[df['col1'] > 5] 将返回 DataFrame df 中所有满足列 col1 的值大于 5 的行。该库还实现了基于拆分-应用-组合(split-apply-combine)方法的分组操作,使用户能够根据列值或应用于索引标签的函数来聚合、转换或重构数据。例如,df['col1'].groupby(df['col2']) 按 df['col2'] 中的值对 df['col1'] 中的数据进行分组,而 df.groupby(lambda i: i % 2) 则按索引是否为偶数对整个 DataFrame 的数据进行分组。
该库还提供了处理缺失数据、合并和连接数据集、重塑数据(例如透视和熔化)、时间序列功能以及多种文件格式的输入/输出工具。这些特性使 pandas 成为 Python 数据科学生态系统的基石,通常与 Machine learning 库和 Artificial intelligence 工作流结合使用。它与 NumPy 数组的集成以及与 Deep learning 框架的兼容性,巩固了其在从金融到 Amazon Web Services 云分析等各行业数据预处理管道中的核心地位。