10 分钟上手 pandas#
这是 pandas 的简短介绍,主要面向新用户。您可以在 Cookbook 中找到更复杂的用法。
习惯上,我们这样导入:
pandas 的基本数据结构#
pandas 提供了两种用于处理数据的类:
对象创建#
请参阅 Intro to data structures section 。
通过传递值列表创建 Series ,让 pandas 创建默认的 RangeIndex 。
通过传递带有日期时间索引的 NumPy 数组(使用 DataFrame )和带标签的列来创建 date_range() :
通过传递对象字典创建 DataFrame ,其中键是列标签,值是列的值。
生成的 DataFrame 的列具有不同的 dtypes :
如果您使用的是 IPython,列名(以及公共属性)的 Tab 补全功能将自动启用。以下是将被补全的属性的子集:
如您所见,列 A、B、C 和 D 已经自动补全。E 和 F 也在其中;其余的属性为了简洁已截断。
查看数据#
请参阅 Essentially basics functionality section 。
使用 DataFrame.head() 和 DataFrame.tail() 分别查看 DataFrame 的顶部和底部几行:
显示 DataFrame.index 或 DataFrame.columns :
使用 DataFrame.to_numpy() 返回底层数据的 NumPy 表示形式,不包含索引或列标签:
备注
NumPy 数组对整个数组只有一个 dtype,而 pandas DataFrame 每列有一个 dtype。当您调用 DataFrame.to_numpy() 时,pandas 将找到可以容纳 DataFrame 中 所有 dtype 的 NumPy dtype。如果公共数据类型为 object,DataFrame.to_numpy() 将需要复制数据。
describe() 显示数据的快速统计摘要:
转置数据:
DataFrame.sort_index() 按轴排序:
DataFrame.sort_values() 按值排序:
选择#
备注
虽然用于选择和设置的标准 Python / NumPy 表达式很直观并且在交互式工作中很方便,但对于生产代码,我们建议使用优化的 pandas 数据访问方法 DataFrame.at() 、DataFrame.iat() 、DataFrame.loc() 和 DataFrame.iloc() 。
请参阅索引文档 Indexing and Selecting Data 和 MultiIndex / Advanced Indexing 。
Getitem ([])#
对于 DataFrame ,传递单个标签会选择一个列并生成一个 Series ,等同于 df.A:
对于 DataFrame ,传递切片 : 会选择匹配的行:
按标签选择#
使用 Selection by Label 或 DataFrame.loc() 在 DataFrame.at() 中查看更多内容。
选择匹配标签的行:
选择所有行(:)并指定列标签:
对于标签切片,包括两个端点:
选择单个行和列标签会返回一个标量:
为了快速访问标量(等同于前一种方法):
按位置选择#
使用 Selection by Position 或 DataFrame.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 部分。
统计#
操作一般*不包括*缺失数据。
计算每列的平均值:
计算每行的平均值:
与其他具有不同索引或列的 Series 或 DataFrame 进行操作,结果将与索引或列标签的并集对齐。此外,pandas 会自动沿指定维度广播,并用 np.nan 填充未对齐的标签。
用户自定义函数#
DataFrame.agg() 和 DataFrame.transform() 应用一个用户自定义函数,该函数分别进行归约或广播其结果。
值计数#
更多信息请参阅 Histogramming and Discretization 。
字符串方法#
Series 在 str 属性中配备了一组字符串处理方法,可以方便地对数组的每个元素进行操作,如下面的代码片段所示。更多信息请参阅 Vectorized String Methods 。
合并#
连接#
pandas 提供了各种工具,可以轻松地将 Series 和 DataFrame 对象结合起来,并具有各种集合逻辑(用于索引)以及关系代数功能(用于连接/合并类操作)。
请参阅 Merging section 部分。
使用 concat() 将 pandas 对象逐行连接在一起:
连接#
merge() 支持沿指定列进行 SQL 风格的连接类型。请参阅 Database style joining 部分。
在唯一键上进行 merge() :
分组#
“分组依据”是指包含以下一个或多个步骤的过程:
拆分 数据,根据某些标准将其分成组
应用 一个函数到每个独立的组
组合 结果到一个数据结构中
请参阅 Grouping section 部分。
按列标签分组,选择列标签,然后将 DataFrameGroupBy.sum() 函数应用于生成的分组:
按多个列标签分组会形成 MultiIndex 。
重塑#
请参阅 Hierarchical Indexing and Reshaping 部分。
堆叠#
stack() 方法“压缩”DataFrame 列中的一个级别:
对于“堆叠”的 DataFrame 或 Series(其 index 为 MultiIndex ),stack() 的逆操作是 unstack() ,它默认会解堆叠**最后一个级别**:
透视表#
请参阅 Pivot Tables 部分。
pivot_table() 通过指定 values、index 和 columns 来透视 DataFrame
时间序列#
pandas 提供了简单、强大且高效的功能,用于在频率转换期间执行重采样操作(例如,将秒级数据转换为 5 分钟数据)。这在金融应用中非常常见,但不仅限于此。请参阅 Time Series section 部分。
Series.tz_localize() 将时间序列本地化到某个时区:
Series.tz_convert() 将时区感知的时间序列转换为另一个时区:
向时间序列添加非固定持续时间(BusinessDay :
分类数据#
pandas 可以在 DataFrame 中包含分类数据。有关完整文档,请参阅 categorical introduction 和 API documentation 。
将原始分数值转换为分类数据类型:
将类别重命名为更有意义的名称:
重新排序类别并同时添加缺失的类别(Series.cat() 下的方法默认返回新的 Series ):
排序是按类别中的顺序,而不是按字典顺序:
使用 observed=False 按分类列进行分组也会显示空的类别:
绘图#
请参阅 Plotting 文档。
我们使用标准的约定来引用 matplotlib API:
plt.close 方法用于 close 图形窗口:
备注
在使用 Jupyter 时,绘图将使用 plot() 显示。否则,请使用 matplotlib.pyplot.show 来显示它,或使用 matplotlib.pyplot.savefig 将其写入文件。
plot() 会绘出所有列:
导入和导出数据#
请参阅 IO Tools 部分。
CSV#
Parquet#
写入 Parquet 文件:
使用 read_parquet() 从 Parquet 文件存储读取:
Excel#
读写 Excel 。
使用 DataFrame.to_excel() 写入 Excel 文件:
使用 read_excel() 从 Excel 文件读取:
注意事项#
如果您尝试对 Series 或 DataFrame 执行布尔运算,您可能会看到类似以下的异常:
请参阅 Comparisons 和 Gotchas 以获取解释和操作方法。