10 分钟上手 pandas#

这是 pandas 的简短介绍,主要面向新用户。您可以在 Cookbook 中找到更复杂的用法。

习惯上,我们这样导入:

pandas 的基本数据结构#

pandas 提供了两种用于处理数据的类:

  1. Series :一种一维的带标签数组,可容纳任何类型的数据

    例如整数、字符串、Python 对象等。

  2. DataFrame :一种二维数据结构,其数据结构类似于二维数组或带行和列的表。

对象创建#

请参阅 Intro to data structures section

通过传递值列表创建 Series ,让 pandas 创建默认的 RangeIndex

通过传递带有日期时间索引的 NumPy 数组(使用 DataFrame )和带标签的列来创建 date_range()

通过传递对象字典创建 DataFrame ,其中键是列标签,值是列的值。

生成的 DataFrame 的列具有不同的 dtypes

如果您使用的是 IPython,列名(以及公共属性)的 Tab 补全功能将自动启用。以下是将被补全的属性的子集:

如您所见,列 ABCD 已经自动补全。EF 也在其中;其余的属性为了简洁已截断。

查看数据#

请参阅 Essentially basics functionality section

使用 DataFrame.head()DataFrame.tail() 分别查看 DataFrame 的顶部和底部几行:

显示 DataFrame.indexDataFrame.columns

使用 DataFrame.to_numpy() 返回底层数据的 NumPy 表示形式,不包含索引或列标签:

备注

NumPy 数组对整个数组只有一个 dtype,而 pandas DataFrame 每列有一个 dtype。当您调用 DataFrame.to_numpy() 时,pandas 将找到可以容纳 DataFrame 中 所有 dtype 的 NumPy dtype。如果公共数据类型为 objectDataFrame.to_numpy() 将需要复制数据。

describe() 显示数据的快速统计摘要:

转置数据:

DataFrame.sort_index() 按轴排序:

DataFrame.sort_values() 按值排序:

选择#

备注

虽然用于选择和设置的标准 Python / NumPy 表达式很直观并且在交互式工作中很方便,但对于生产代码,我们建议使用优化的 pandas 数据访问方法 DataFrame.at()DataFrame.iat()DataFrame.loc()DataFrame.iloc()

请参阅索引文档 Indexing and Selecting DataMultiIndex / Advanced Indexing

Getitem ([])#

对于 DataFrame ,传递单个标签会选择一个列并生成一个 Series ,等同于 df.A

对于 DataFrame ,传递切片 : 会选择匹配的行:

按标签选择#

使用 Selection by LabelDataFrame.loc()DataFrame.at() 中查看更多内容。

选择匹配标签的行:

选择所有行(:)并指定列标签:

对于标签切片,包括两个端点:

选择单个行和列标签会返回一个标量:

为了快速访问标量(等同于前一种方法):

按位置选择#

使用 Selection by PositionDataFrame.iloc()DataFrame.iat() 中查看更多内容。

通过传递的整数的位置进行选择:

整数切片与 NumPy/Python 的行为类似:

整数位置列表:

明确地对行进行切片:

明确地对列进行切片:

明确地获取一个值:

为了快速访问标量(等同于前一种方法):

布尔索引#

选择 df.A 大于 0 的行。

选择满足布尔条件的 DataFrame 中的值:

使用 isin() 方法进行过滤:

设置#

设置新列会自动按索引对齐数据:

按标签设置值:

按位置设置值:

通过 NumPy 数组赋值进行设置:

先前设置操作的结果:

“where”操作及设置:

缺失数据#

对于NumPy数据类型,np.nan 代表缺失数据。默认情况下,它不包含在计算中。请参阅 Missing Data section 部分。

重新索引允许您更改/添加/删除指定轴上的索引。这将返回数据副本:

DataFrame.dropna() 删除所有包含缺失数据的行:

DataFrame.fillna() 填充缺失数据:

isna() 获取值为 nan 的布尔掩码:

操作#

请参阅 Basic section on Binary Ops 部分。

统计#

操作一般*不包括*缺失数据。

计算每列的平均值:

计算每行的平均值:

与其他具有不同索引或列的 SeriesDataFrame 进行操作,结果将与索引或列标签的并集对齐。此外,pandas 会自动沿指定维度广播,并用 np.nan 填充未对齐的标签。

用户自定义函数#

DataFrame.agg()DataFrame.transform() 应用一个用户自定义函数,该函数分别进行归约或广播其结果。

值计数#

更多信息请参阅 Histogramming and Discretization

字符串方法#

Seriesstr 属性中配备了一组字符串处理方法,可以方便地对数组的每个元素进行操作,如下面的代码片段所示。更多信息请参阅 Vectorized String Methods

合并#

连接#

pandas 提供了各种工具,可以轻松地将 SeriesDataFrame 对象结合起来,并具有各种集合逻辑(用于索引)以及关系代数功能(用于连接/合并类操作)。

请参阅 Merging section 部分。

使用 concat() 将 pandas 对象逐行连接在一起:

备注

DataFrame 添加列相对较快。但是,添加行需要复制,可能会很昂贵。我们建议将预先构建的记录列表传递给 DataFrame 构造函数,而不是通过迭代地附加记录来构建 DataFrame

连接#

merge() 支持沿指定列进行 SQL 风格的连接类型。请参阅 Database style joining 部分。

在唯一键上进行 merge()

分组#

“分组依据”是指包含以下一个或多个步骤的过程:

  • 拆分 数据,根据某些标准将其分成组

  • 应用 一个函数到每个独立的组

  • 组合 结果到一个数据结构中

请参阅 Grouping section 部分。

按列标签分组,选择列标签,然后将 DataFrameGroupBy.sum() 函数应用于生成的分组:

按多个列标签分组会形成 MultiIndex

重塑#

请参阅 Hierarchical Indexing and Reshaping 部分。

堆叠#

stack() 方法“压缩”DataFrame 列中的一个级别:

对于“堆叠”的 DataFrame 或 Series(其 indexMultiIndex ),stack() 的逆操作是 unstack() ,它默认会解堆叠**最后一个级别**:

透视表#

请参阅 Pivot Tables 部分。

pivot_table() 通过指定 valuesindexcolumns 来透视 DataFrame

时间序列#

pandas 提供了简单、强大且高效的功能,用于在频率转换期间执行重采样操作(例如,将秒级数据转换为 5 分钟数据)。这在金融应用中非常常见,但不仅限于此。请参阅 Time Series section 部分。

Series.tz_localize() 将时间序列本地化到某个时区:

Series.tz_convert() 将时区感知的时间序列转换为另一个时区:

向时间序列添加非固定持续时间(BusinessDay

分类数据#

pandas 可以在 DataFrame 中包含分类数据。有关完整文档,请参阅 categorical introductionAPI documentation

将原始分数值转换为分类数据类型:

将类别重命名为更有意义的名称:

重新排序类别并同时添加缺失的类别(Series.cat() 下的方法默认返回新的 Series ):

排序是按类别中的顺序,而不是按字典顺序:

使用 observed=False 按分类列进行分组也会显示空的类别:

绘图#

请参阅 Plotting 文档。

我们使用标准的约定来引用 matplotlib API:

plt.close 方法用于 close 图形窗口:

备注

在使用 Jupyter 时,绘图将使用 plot() 显示。否则,请使用 matplotlib.pyplot.show 来显示它,或使用 matplotlib.pyplot.savefig 将其写入文件。

plot() 会绘出所有列:

导入和导出数据#

请参阅 IO Tools 部分。

CSV#

Writing to a csv file: 使用 DataFrame.to_csv()

Reading from a csv file: 使用 read_csv()

Parquet#

写入 Parquet 文件:

使用 read_parquet() 从 Parquet 文件存储读取:

Excel#

读写 Excel

使用 DataFrame.to_excel() 写入 Excel 文件:

使用 read_excel() 从 Excel 文件读取:

注意事项#

如果您尝试对 SeriesDataFrame 执行布尔运算,您可能会看到类似以下的异常:

请参阅 ComparisonsGotchas 以获取解释和操作方法。