社区教程
这是社区提供的许多 pandas 教程的指南,主要面向新用户。
由 Julia Evans 撰写的 pandas cookbook
这本 2015 年的 cookbook(由Julia Evans撰写)的目标是为您提供一些具体的示例,帮助您开始使用 pandas。这些都是使用真实数据的示例,以及所有相关的错误和怪异之处。有关目录,请参阅pandas-cookbook GitHub 仓库。
由 Stefanie Molin 撰写的 pandas 工作坊
由Stefanie Molin撰写的入门工作坊,旨在快速让您掌握 pandas,并使用真实世界数据集。内容涵盖了 pandas 入门、数据整理和数据可视化(同时也涉及到 matplotlib 和 seaborn)。pandas-workshop GitHub 仓库提供了详细的环境设置说明(包括 Binder 环境)、幻灯片和笔记本供跟随学习,以及练习来练习概念。还有一个实验室,提供了一个未在工作坊中涵盖的数据集的新练习,供额外练习。
由 Hernan Rojas 撰写的学习 pandas
一套面向新手 pandas 用户的课程:bitbucket.org/hrojas/learn-pandas
使用 Python 进行实用数据分析
这个指南是使用 Python 数据生态系统进行数据分析过程的介绍,以及一个有趣的开放数据集。有四个部分涵盖了选定主题,如munging data、aggregating data、visualizing data和time series。
新用户练习
通过真实数据集和练习来提升你的技能。更多资源,请访问主要仓库。## 现代 pandas
2016 年由Tom Augspurger撰写的教程系列。源代码可在 GitHub 仓库TomAugspurger/effective-pandas中找到。
使用 pandas、vincent 和 xlsxwriter 制作 Excel 图表
快乐的 pandas
由耿元浩撰写的中文教程。涵盖了 NumPy 和 pandas 的基本操作,4 种主要的数据操作方法(包括索引、分组、重塑和连接)以及 4 种主要的数据类型(包括缺失数据、字符串数据、分类数据和时间序列数据)。每章末尾都会发布相应的练习。所有数据集和相关材料都可以在 GitHub 仓库datawhalechina/joyful-pandas中找到。
视频教程
- 从零开始的 Pandas(2015)(2:24)GitHub 仓库
- Pandas 入门(2016)(1:28)GitHub 仓库
- Pandas:从.head()到.tail()(2016)(1:26)GitHub 仓库
- 使用 pandas 进行 Python 数据分析(2016-2018)GitHub 仓库和Jupyter Notebook
- 与 pandas 一起的最佳实践(2018)GitHub 仓库和Jupyter Notebook
各种教程
- Wes McKinney(pandas BDFL)的博客
- 使用 SciPy 和 pandas 数据框架在 Python 中轻松进行统计分析,由 Randal Olson 制作
- Python 中的统计数据分析,由 SciPy 2013 的 Christopher Fonnesbeck 制作的教程视频
- Thomas Wiecki 制作的 Python 中的金融分析
- Greg Reda 制作的 pandas 数据结构简介
- Pandas 数据框教程,由 Karlijn Willems 制作
- 具有真实生活示例的简明教程
- 由稻田一心制作的 430 多个可搜索的 Pandas 示例
由 Julia Evans 制作的 pandas 食谱
这本 2015 年的食谱书(由朱莉娅·埃文斯编写)的目标是为您提供一些具体的示例,帮助您开始使用熊猫。这些都是使用真实世界数据的示例,包括所有相关的错误和怪异之处。有关目录,请参阅pandas-cookbook GitHub 仓库。
Stefanie Molin 主持的熊猫工作坊
Stefanie Molin 主持的入门熊猫工作坊,旨在快速让您掌握熊猫,使用真实数据集。内容涵盖了熊猫入门、数据整理和数据可视化(并介绍了 matplotlib 和 seaborn)。pandas-workshop GitHub 仓库提供了详细的环境设置说明(包括 Binder 环境)、幻灯片和笔记本供跟随学习,以及练习来练习概念。还有一个实验室,提供了一些未在工作坊中涵盖的数据集的新练习,供额外练习。
通过 Hernan Rojas 学习熊猫
为新熊猫用户准备的一套课程:bitbucket.org/hrojas/learn-pandas
用 Python 进行实用数据分析
这个指南是一个介绍如何使用 Python 数据生态系统和一个有趣的开放数据集进行数据分析的过程。有四个部分涵盖了选定主题,如数据整理、数据聚合、数据可视化和时间序列。
新用户练习
通过真实数据集和练习来提升你的技能。更多资源,请访问主要仓库。
现代熊猫
2016 年由Tom Augspurger编写的教程系列。源代码可在 GitHub 仓库TomAugspurger/effective-pandas中找到。
使用熊猫、文森特和 xlsxwriter 制作 Excel 图表
快乐的熊猫
由耿元浩编写的中文教程。涵盖了 NumPy 和 pandas 的基本操作,4 种主要数据操作方法(包括索引、分组、重塑和连接)以及 4 种主要数据类型(包括缺失数据、字符串数据、分类数据和时间序列数据)。每章末尾都有相应的练习。所有数据集和相关材料都可以在 GitHub 仓库datawhalechina/joyful-pandas中找到。
视频教程
- 从零开始学习 Pandas (2015) (2:24) GitHub 仓库
- Pandas 入门 (2016) (1:28) GitHub 仓库
- Pandas: .head()到.tail() (2016) (1:26) GitHub 仓库
- 使用 pandas 在 Python 中进行数据分析 (2016-2018) GitHub 仓库 和 Jupyter Notebook
- 使用 pandas 的最佳实践 (2018) GitHub 仓库 和 Jupyter Notebook
各种教程
- Wes McKinney(pandas BDFL)的博客
- 使用 SciPy 和 pandas 数据框轻松进行 Python 统计分析,由 Randal Olson 提供
- Python 中的统计数据分析,由 SciPy 2013 的 Christopher Fonnesbeck 提供的教程视频
- Thomas Wiecki 提供的 Python 中的金融分析
- Greg Reda 提供的 pandas 数据结构简介
- Pandas 数据框教程,由 Karlijn Willems 提供
- 具有真实生活示例的简明教程
- 由 Inada Isshin 提供的 430 多个可搜索的 Pandas 示例
用户指南
用户指南涵盖了 pandas 的所有主题领域。每个子部分介绍一个主题(如“处理缺失数据”),并讨论 pandas 如何解决该问题,其中穿插着许多示例。
对于刚开始使用 pandas 的用户,应从 10 分钟入门 pandas 开始。
要了解 pandas 基础知识的高层摘要,请参阅数据结构简介和基本功能。
可以在 API 参考中获取有关任何特定方法的更多信息。
如何阅读这些指南
在这些指南中,您将看到代码块内的输入代码,例如:
import pandas as pd pd.DataFrame({'A': [1, 2, 3]})
或者:
In [1]: import pandas as pd In [2]: pd.DataFrame({'A': [1, 2, 3]}) Out[2]: A 0 1 1 2 2 3
第一个块是标准的 Python 输入,而第二个块中的 In [1]:
表示输入在一个笔记本中。在 Jupyter 笔记本中,最后一行会被打印出来,并且图表会内联显示。
例如:
In [3]: a = 1 In [4]: a Out[4]: 1
等同于:
a = 1 print(a)
指南
- 10 分钟入门 pandas
- pandas 中的基本数据结构
- 对象创建
- 查看数据
- 选择
- 缺失数据
- 操作
- 合并
- 分组
- 重塑
- 时间序列
- 分类数据
- 绘图
- 导入和导出数据
- 注意事项
- 数据结构简介
- Series
- 数据框
- 基本功能
- 头部和尾部
- 属性和底层数据
- 加速操作
- 灵活的二进制操作
- 描述性统计
- 函数应用
- 重新索引和更改标签
- 迭代
- .dt 访问器
- 矢量化字符串方法
- 排序
- 复制
- 数据类型
- 基于
dtype
选择列
- IO 工具(文本,CSV,HDF5,…)
- CSV 和文本文件
- JSON
- HTML
- LaTeX
- XML
- Excel 文件
- OpenDocument 电子表格
- 二进制 Excel(.xlsb)文件
- Calamine(Excel 和 ODS 文件)
- 剪贴板
- Pickling
- 消息包
- HDF5(PyTables)
- Feather
- Parquet
- ORC
- SQL 查询
- Google BigQuery
- Stata 格式
- SAS 格式
- SPSS 格式
- 其他文件格式
- 性能考虑
- PyArrow 功能
- 数据结构集成
- 操作
- I/O 读取
- 索引和选择数据
- 不同的索引选择方式
- 基础知识
- 属性访问
- 切片范围
- 通过标签进行选择
- 通过位置进行选择
- 通过可调用对象进行选择
- 结合位置和基于标签的索引
- 选择随机样本
- 扩充设置
- 快速标量值获取和设置
- 布尔索引
- 使用 isin 进行索引
where()
方法和掩码- 通过
numpy()
有条件地扩充设置 query()
方法- 重复数据
- 类似字典的
get()
方法 - 通过索引/列标签查找数值
- 索引对象
- 设置/重置索引
- 返回视图还是副本
- MultiIndex / 高级索引
- 分层索引(MultiIndex)
- 使用分层索引进行高级索引
- 对
MultiIndex
进行排序 - 取值方法
- 索引类型
- 杂项索引常见问题解答
- 写时复制(CoW)
- 先前的行为
- 迁移至写时复制
- 描述
- 链式赋值
- 只读的 NumPy 数组
- 要避免的模式
- 写时复制优化
- 如何启用 CoW
- 合并、连接、串联和比较
concat()
merge()
DataFrame.join()
merge_ordered()
merge_asof()
compare()
- 重塑和透视表
pivot()
和pivot_table()
stack()
和unstack()
melt()
和wide_to_long()
get_dummies()
和from_dummies()
explode()
crosstab()
cut()
factorize()
- 处理文本数据
- 文本数据类型
- 字符串方法
- 拆分和替换字符串
- 串联
- 使用
.str
进行索引 - 提取子字符串
- 测试匹配或包含模式的字符串
- 创建指示变量
- 方法摘要
- 处理缺失数据
- 被视为“缺失”的值
NA
语义- 插入缺失数据
- 处理缺失数据的计算
- 丢弃缺失数据
- 填充缺失数据
- 重复标签
- 重复标签的后果
- 重复标签检测
- 禁止重复标签
- 分类数据
- 对象创建
- CategoricalDtype
- 描述
- 处理分类数据
- 排序和顺序
- 比较
- 操作
- 数据整理
- 数据的输入/输出
- 缺失数据
- 与 R 的
factor
的差异 - 注意事项
- 可空整数数据类型
- 构造
- 操作
- 标量 NA 值
- 可空布尔数据类型
- 带 NA 值的索引
- Kleene 逻辑操作
- 图表可视化
- 基本绘图:
plot
- 其他图表
- 绘制缺失数据
- 绘图工具
- 绘图格式化
- 直接使用 Matplotlib 绘图
- 绘图后端
- 表可视化
- 样式化对象和自定义显示
- 格式化显示
- 样式化对象和 HTML
- 添加样式的方法
- 表样式
- 设置类和链接到外部 CSS
- 样式化函数
- 工具提示和标题
- 使用切片进行更精细的控制
- 优化
- 内置样式
- 共享样式
- 限制
- 其他有趣和有用的功能
- 导出到 Excel
- 导出到 LaTeX
- 关于 CSS 和 HTML 的更多信息
- 可扩展性
- 分组:拆分-应用-组合
- 将对象分组
- 遍历分组
- 选择一个分组
- 聚合
- 转换
- 过滤
- 灵活的
apply
- Numba 加速例程
- 其他有用的功能
- 示例
- 窗口操作
- 概览
- 滚动窗口
- 加权窗口
- 扩展窗口
- 指数加权窗口
- 时间序列/日期功能
- 概览
- 时间戳 vs. 时间跨度
- 转换为时间戳
- Generating ranges of timestamps
- Timestamp limitations
- Indexing
- Time/date components
- DateOffset objects
- Time Series-related instance methods
- Resampling
- Time span representation
- Converting between representations
- Representing out-of-bounds spans
- Time zone handling
- Time deltas
- Parsing
- Operations
- Reductions
- Frequency conversion
- Attributes
- TimedeltaIndex
- Resampling
- Options and settings
- Overview
- Available options
- Getting and setting options
- Setting startup options in Python/IPython environment
- Frequently used options
- Number formatting
- Unicode formatting
- Table schema display
- Enhancing performance
- Cython (writing C extensions for pandas)
- Numba (JIT compilation)
- Expression evaluation via
eval()
- Scaling to large datasets
- Load less data
- Use efficient datatypes
- Use chunking
- Use Other Libraries
- Sparse data structures
- SparseArray
- SparseDtype
- Sparse accessor
- Sparse calculation
- Interaction with scipy.sparse
- Frequently Asked Questions (FAQ)
- DataFrame memory usage
- Using if/truth statements with pandas
- Mutating with User Defined Function (UDF) methods
- Missing value representation for NumPy types
- Differences with NumPy
- Thread-safety
- 字节顺序问题
- 食谱
- 习惯用法
- 选择
- 多索引
- 缺失数据
- 分组
- 时间序列
- 合并
- 绘图
- 数据输入/输出
- 计算
- 时间增量
- 创建示例数据
- 常量序列
如何阅读这些指南
在这些指南中,您将看到代码块中的输入代码,例如:
import pandas as pd pd.DataFrame({'A': [1, 2, 3]})
或者:
In [1]: import pandas as pd In [2]: pd.DataFrame({'A': [1, 2, 3]}) Out[2]: A 0 1 1 2 2 3
第一个块是标准的 Python 输入,而第二个块中的 In [1]:
表示输入位于 笔记本 中。在 Jupyter 笔记本中,最后一行被打印出来,图表在行内显示。
例如:
In [3]: a = 1 In [4]: a Out[4]: 1
等价于:
a = 1 print(a)
指南
- pandas 十分钟入门
- pandas 中的基本数据结构
- 对象创建
- 查看数据
- 选择
- 缺失数据
- 操作
- 合并
- 分组
- 重塑
- 时间序列
- 类别
- 绘图
- 导入和导出数据
- 注意事项
- 数据结构简介
- 序列
- 数据框
- 基本要点
- 头部和尾部
- 属性和底层数据
- 加速操作
- 灵活的二进制操作
- 描述统计
- 函数应用
- 重新索引和修改标签
- 迭代
- .dt 访问器
- 向量化字符串方法
- 排序
- 复制
- 数据类型
- 基于
dtype
选择列
- IO 工具(文本、CSV、HDF5 等)
- CSV 和文本文件
- JSON
- HTML
- LaTeX
- XML
- Excel 文件
- OpenDocument 电子表格
- 二进制 Excel(.xlsb)文件
- Calamine(Excel 和 ODS 文件)
- 剪贴板
- 腌制
- msgpack
- HDF5(PyTables)
- Feather
- Parquet
- ORC
- SQL 查询
- Google BigQuery
- Stata 格式
- SAS 格式
- SPSS 格式
- 其他文件格式
- 性能考虑
- PyArrow 功能
- 数据结构集成
- 操作
- 输入/输出读取
- 索引和选择数据
- 索引的不同选择
- 基础知识
- 属性访问
- 切片范围
- 按标签选择
- 按位置选择
- 通过可调用进行选择
- 结合位置和基于标签的索引
- 选择随机样本
- 带扩展的设置
- 快速标量值获取和设置
- 布尔索引
- 使用 isin 进行索引
where()
方法和掩码- 使用
numpy()
条件性地扩大设置 query()
方法- 重复数据
- 类似字典的
get()
方法 - 通过索引/列标签查找值
- 索引对象
- 设置/重置索引
- 返回视图与副本
- MultiIndex / 高级索引
- 分层索引(MultiIndex)
- 具有分层索引的高级索引
MultiIndex
的排序- Take 方法
- 索引类型
- 杂项索引 FAQ
- 写时复制(CoW)
- 之前的行为
- 迁移到写时复制
- 描述
- 链式赋值
- 只读 NumPy 数组
- 要避免的模式
- 写时复制优化
- 如何启用 CoW
- 合并、连接、串联和比较
concat()
merge()
DataFrame.join()
merge_ordered()
merge_asof()
compare()
- 重塑和数据透视表
pivot()
和pivot_table()
stack()
和unstack()
melt()
和wide_to_long()
get_dummies()
和from_dummies()
explode()
crosstab()
cut()
factorize()
- 处理文本数据
- 文本数据类型
- 字符串方法
- 字符串拆分和替换
- 串联
- 使用
.str
进行索引 - 提取子字符串
- 测试匹配或包含模式的字符串
- 创建指示变量
- 方法摘要
- 处理缺失数据
- 被视为“缺失”的值
NA
语义- 插入缺失数据
- 处理带有缺失数据的计算
- 删除缺失数据
- 填充缺失数据
- 重复标签
- 重复标签的后果
- 重复标签检测
- 不允许重复标签
- 分类数据
- 对象创建
- CategoricalDtype
- 描述
- 处理分类数据
- 排序和顺序
- 比较
- 操作
- 数据整理
- 数据的输入输出
- 缺失数据
- 与 R 的
factor
的差异 - 注意事项
- 可空整数数据类型
- 构造
- 操作
- 标量 NA 值
- 可空布尔数据类型
- 带有 NA 值的索引
- 克里尼逻辑操作
- 图表可视化
- 基本绘图:
plot
- 其他图表
- 绘制带有缺失数据的图表
- 绘图工具
- 绘图格式化
- 直接使用 Matplotlib 绘图
- 绘图后端
- 表格可视化
- 样式对象和自定义显示
- 格式化显示
- 样式对象和 HTML
- 添加样式的方法
- 表格样式
- 设置类和链接到外部 CSS
- 样式函数
- 工具提示和标题
- 使用切片进行精细控制
- 优化
- 内置样式
- 共享样式
- 限制
- 其他有趣且有用的内容
- 导出到 Excel
- 导出到 LaTeX
- 更多关于 CSS 和 HTML
- 可扩展性
- 分组:分割-应用-合并
- 将对象拆分成组
- 遍历组
- 选择一组
- 聚合
- 变换
- 过滤
- 灵活的
apply
- Numba 加速例程
- 其他有用功能
- 示例
- 窗口操作
- 概述
- 滚动窗口
- 加权窗口
- 扩展窗口
- 指数加权窗口
- 时间序列/日期功能
- 概述
- 时间戳 vs. 时间跨度
- 转换为时间戳
- 生成时间戳范围
- 时间戳限制
- 索引
- 时间/日期组件
- DateOffset 对象
- 与时间序列相关的实例方法
- 重新取样
- 时间跨度表示
- 在不同表示之间转换
- 表示越界跨度
- 时区处理
- 时间增量
- 解析
- 操作
- 减少
- 频率转换
- 属性
- TimedeltaIndex
- 重新取样
- 选项和设置
- 概述
- 可用选项
- 获取和设置选项
- 在 Python/IPython 环境中设置启动选项
- 常用选项
- 数字格式化
- Unicode 格式化
- 表模式显示
- 增强性能
- Cython(为 pandas 编写 C 扩展)
- Numba(JIT 编译)
eval()
表达式评估
- 扩展到大数据集
- 减少数据加载
- 使用高效数据类型
- 使用分块
- 使用其他库
- 稀疏数据结构
- SparseArray
- SparseDtype
- 稀疏访问器
- 稀疏计算
- 与 scipy.sparse 的交互
- 常见问题解答(FAQ)
- DataFrame 内存使用情况
- 与 pandas 一起使用 if/真值语句
- 使用用户定义函数 (UDF) 方法进行突变
- NumPy 类型的缺失值表示
- 与 NumPy 的差异
- 线程安全
- 字节顺序问题
- 食谱
- 习语
- 选择
- 多级索引
- 缺失数据
- 分组
- 时间序列
- 合并
- 绘图
- 数据输入/输出
- 计算
- 时间增量
- 创建示例数据
- 常数序列
pandas 十分钟入门
这是针对新用户的 pandas 的简短介绍。您可以在食谱中查看更复杂的示例。
通常,我们按照以下方式导入:
In [1]: import numpy as np In [2]: import pandas as pd
pandas 中的基本数据结构
Pandas 提供了两种处理数据的类:
Series
:一个一维带标签的数组,保存任何类型的数据
例如整数、字符串、Python 对象等。DataFrame
:一种二维数据结构,类似于二维数组或带有行和列的表。
对象创建
参见数据结构介绍部分。
通过传递值列表来创建一个Series
,让 pandas 创建一个默认的RangeIndex
。
In [3]: s = pd.Series([1, 3, 5, np.nan, 6, 8]) In [4]: s Out[4]: 0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64
通过传递具有日期时间索引和标记列的 NumPy 数组使用date_range()
和标记列来创建一个DataFrame
:
In [5]: dates = pd.date_range("20130101", periods=6) In [6]: dates Out[6]: DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04', '2013-01-05', '2013-01-06'], dtype='datetime64[ns]', freq='D') In [7]: df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list("ABCD")) In [8]: df Out[8]: A B C D 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 2013-01-06 -0.673690 0.113648 -1.478427 0.524988
通过传递一个对象字典来创建一个DataFrame
,其中键是列标签,值是列值。
In [9]: df2 = pd.DataFrame( ...: { ...: "A": 1.0, ...: "B": pd.Timestamp("20130102"), ...: "C": pd.Series(1, index=list(range(4)), dtype="float32"), ...: "D": np.array([3] * 4, dtype="int32"), ...: "E": pd.Categorical(["test", "train", "test", "train"]), ...: "F": "foo", ...: } ...: ) ...: In [10]: df2 Out[10]: A B C D E F 0 1.0 2013-01-02 1.0 3 test foo 1 1.0 2013-01-02 1.0 3 train foo 2 1.0 2013-01-02 1.0 3 test foo 3 1.0 2013-01-02 1.0 3 train foo
结果DataFrame
的列具有不同的 dtypes:
In [11]: df2.dtypes Out[11]: A float64 B datetime64[s] C float32 D int32 E category F object dtype: object
如果您正在使用 IPython,则会自动启用列名(以及公共属性)的选项完成。这是将完成的属性的子集:
In [12]: df2.<TAB> # noqa: E225, E999 df2.A df2.bool df2.abs df2.boxplot df2.add df2.C df2.add_prefix df2.clip df2.add_suffix df2.columns df2.align df2.copy df2.all df2.count df2.any df2.combine df2.append df2.D df2.apply df2.describe df2.applymap df2.diff df2.B df2.duplicated
如您所见,列A
、B
、C
和D
都已自动完成。E
和F
也是如此;其余的属性由于篇幅被截断。
查看数据
参见基本功能部分。
使用DataFrame.head()
和DataFrame.tail()
分别查看框架的顶部和底部行:
In [13]: df.head() Out[13]: A B C D 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 In [14]: df.tail(3) Out[14]: A B C D 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 2013-01-06 -0.673690 0.113648 -1.478427 0.524988
显示DataFrame.index
或DataFrame.columns
:
In [15]: df.index Out[15]: DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04', '2013-01-05', '2013-01-06'], dtype='datetime64[ns]', freq='D') In [16]: df.columns Out[16]: Index(['A', 'B', 'C', 'D'], dtype='object')
使用DataFrame.to_numpy()
返回底层数据的 NumPy 表示形式,不包括索引或列标签:
In [17]: df.to_numpy() Out[17]: array([[ 0.4691, -0.2829, -1.5091, -1.1356], [ 1.2121, -0.1732, 0.1192, -1.0442], [-0.8618, -2.1046, -0.4949, 1.0718], [ 0.7216, -0.7068, -1.0396, 0.2719], [-0.425 , 0.567 , 0.2762, -1.0874], [-0.6737, 0.1136, -1.4784, 0.525 ]])
注意
NumPy 数组整个数组有一个 dtype,而 pandas DataFrames 每列有一个 dtype。当您调用 DataFrame.to_numpy()
,pandas 将找到可以容纳 DataFrame 中 所有 dtypes 的 NumPy dtype。如果通用数据类型是 object
,DataFrame.to_numpy()
将需要复制数据。
In [18]: df2.dtypes Out[18]: A float64 B datetime64[s] C float32 D int32 E category F object dtype: object In [19]: df2.to_numpy() Out[19]: array([[1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'], [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo'], [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'], [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo']], dtype=object)
describe()
显示数据的快速统计摘要:
In [20]: df.describe() Out[20]: A B C D count 6.000000 6.000000 6.000000 6.000000 mean 0.073711 -0.431125 -0.687758 -0.233103 std 0.843157 0.922818 0.779887 0.973118 min -0.861849 -2.104569 -1.509059 -1.135632 25% -0.611510 -0.600794 -1.368714 -1.076610 50% 0.022070 -0.228039 -0.767252 -0.386188 75% 0.658444 0.041933 -0.034326 0.461706 max 1.212112 0.567020 0.276232 1.071804
转置您的数据:
In [21]: df.T Out[21]: 2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06 A 0.469112 1.212112 -0.861849 0.721555 -0.424972 -0.673690 B -0.282863 -0.173215 -2.104569 -0.706771 0.567020 0.113648 C -1.509059 0.119209 -0.494929 -1.039575 0.276232 -1.478427 D -1.135632 -1.044236 1.071804 0.271860 -1.087401 0.524988
DataFrame.sort_index()
按轴排序:
In [22]: df.sort_index(axis=1, ascending=False) Out[22]: D C B A 2013-01-01 -1.135632 -1.509059 -0.282863 0.469112 2013-01-02 -1.044236 0.119209 -0.173215 1.212112 2013-01-03 1.071804 -0.494929 -2.104569 -0.861849 2013-01-04 0.271860 -1.039575 -0.706771 0.721555 2013-01-05 -1.087401 0.276232 0.567020 -0.424972 2013-01-06 0.524988 -1.478427 0.113648 -0.673690
DataFrame.sort_values()
按值排序:
In [23]: df.sort_values(by="B") Out[23]: A B C D 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 2013-01-06 -0.673690 0.113648 -1.478427 0.524988 2013-01-05 -0.424972 0.567020 0.276232 -1.087401
选择
注意
当选择和设置标准 Python / NumPy 表达式对于交互式工作来说直观且方便,但对于生产代码,我们推荐优化的 pandas 数据访问方法,DataFrame.at()
,DataFrame.iat()
,DataFrame.loc()
和 DataFrame.iloc()
。
查看索引文档 索引和选择数据 和 MultiIndex / 高级索引。
Getitem ([]
)
对于 DataFrame
,传递单个标签选择一个列并产生等同于 df.A
的 Series
:
In [24]: df["A"] Out[24]: 2013-01-01 0.469112 2013-01-02 1.212112 2013-01-03 -0.861849 2013-01-04 0.721555 2013-01-05 -0.424972 2013-01-06 -0.673690 Freq: D, Name: A, dtype: float64
对于 DataFrame
,传递一个切片 :
选择匹配的行:
In [25]: df[0:3] Out[25]: A B C D 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 In [26]: df["20130102":"20130104"] Out[26]: A B C D 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 2013-01-04 0.721555 -0.706771 -1.039575 0.271860
按标签选择
在 按标签选择 中查看更多使用 DataFrame.loc()
或 DataFrame.at()
。
选择匹配标签的行:
In [27]: df.loc[dates[0]] Out[27]: A 0.469112 B -0.282863 C -1.509059 D -1.135632 Name: 2013-01-01 00:00:00, dtype: float64
选择所有行(:
)与选择列标签:
In [28]: df.loc[:, ["A", "B"]] Out[28]: A B 2013-01-01 0.469112 -0.282863 2013-01-02 1.212112 -0.173215 2013-01-03 -0.861849 -2.104569 2013-01-04 0.721555 -0.706771 2013-01-05 -0.424972 0.567020 2013-01-06 -0.673690 0.113648
对于标签切片,两个端点都是 包含 的:
In [29]: df.loc["20130102":"20130104", ["A", "B"]] Out[29]: A B 2013-01-02 1.212112 -0.173215 2013-01-03 -0.861849 -2.104569 2013-01-04 0.721555 -0.706771
选择单行和列标签返回一个标量:
In [30]: df.loc[dates[0], "A"] Out[30]: 0.4691122999071863
为了快速访问标量(等同于先前的方法):
In [31]: df.at[dates[0], "A"] Out[31]: 0.4691122999071863
按位置选择
在按位置选择中使用DataFrame.iloc()
或DataFrame.iat()
查看更多。
通过传递的整数位置选择:
In [32]: df.iloc[3] Out[32]: A 0.721555 B -0.706771 C -1.039575 D 0.271860 Name: 2013-01-04 00:00:00, dtype: float64
整数切片类似于 NumPy/Python:
In [33]: df.iloc[3:5, 0:2] Out[33]: A B 2013-01-04 0.721555 -0.706771 2013-01-05 -0.424972 0.567020
整数位置位置的列表:
In [34]: df.iloc[[1, 2, 4], [0, 2]] Out[34]: A C 2013-01-02 1.212112 0.119209 2013-01-03 -0.861849 -0.494929 2013-01-05 -0.424972 0.276232
明确切片行:
In [35]: df.iloc[1:3, :] Out[35]: A B C D 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
明确切片列:
In [36]: df.iloc[:, 1:3] Out[36]: B C 2013-01-01 -0.282863 -1.509059 2013-01-02 -0.173215 0.119209 2013-01-03 -2.104569 -0.494929 2013-01-04 -0.706771 -1.039575 2013-01-05 0.567020 0.276232 2013-01-06 0.113648 -1.478427
明确获取一个值:
In [37]: df.iloc[1, 1] Out[37]: -0.17321464905330858
快速访问标量(等同于先前的方法):
In [38]: df.iat[1, 1] Out[38]: -0.17321464905330858
布尔索引
选择df.A
大于0
的行。
In [39]: df[df["A"] > 0] Out[39]: A B C D 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 2013-01-04 0.721555 -0.706771 -1.039575 0.271860
从满足布尔条件的DataFrame
中选择值:
In [40]: df[df > 0] Out[40]: A B C D 2013-01-01 0.469112 NaN NaN NaN 2013-01-02 1.212112 NaN 0.119209 NaN 2013-01-03 NaN NaN NaN 1.071804 2013-01-04 0.721555 NaN NaN 0.271860 2013-01-05 NaN 0.567020 0.276232 NaN 2013-01-06 NaN 0.113648 NaN 0.524988
使用isin()
方法进行过滤:
In [41]: df2 = df.copy() In [42]: df2["E"] = ["one", "one", "two", "three", "four", "three"] In [43]: df2 Out[43]: A B C D E 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 one 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 one 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 two 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 three 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 four 2013-01-06 -0.673690 0.113648 -1.478427 0.524988 three In [44]: df2[df2["E"].isin(["two", "four"])] Out[44]: A B C D E 2013-01-03 -0.861849 -2.104569 -0.494929 1.071804 two 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 four
设置
设置新列会自动通过索引对齐数据:
In [45]: s1 = pd.Series([1, 2, 3, 4, 5, 6], index=pd.date_range("20130102", periods=6)) In [46]: s1 Out[46]: 2013-01-02 1 2013-01-03 2 2013-01-04 3 2013-01-05 4 2013-01-06 5 2013-01-07 6 Freq: D, dtype: int64 In [47]: df["F"] = s1
按标签设置值:
In [48]: df.at[dates[0], "A"] = 0
按位置设置值:
In [49]: df.iat[0, 1] = 0
通过分配 NumPy 数组进行设置:
In [50]: df.loc[:, "D"] = np.array([5] * len(df))
先前设置操作的结果:
In [51]: df Out[51]: A B C D F 2013-01-01 0.000000 0.000000 -1.509059 5.0 NaN 2013-01-02 1.212112 -0.173215 0.119209 5.0 1.0 2013-01-03 -0.861849 -2.104569 -0.494929 5.0 2.0 2013-01-04 0.721555 -0.706771 -1.039575 5.0 3.0 2013-01-05 -0.424972 0.567020 0.276232 5.0 4.0 2013-01-06 -0.673690 0.113648 -1.478427 5.0 5.0
使用设置的where
操作:
In [52]: df2 = df.copy() In [53]: df2[df2 > 0] = -df2 In [54]: df2 Out[54]: A B C D F 2013-01-01 0.000000 0.000000 -1.509059 -5.0 NaN 2013-01-02 -1.212112 -0.173215 -0.119209 -5.0 -1.0 2013-01-03 -0.861849 -2.104569 -0.494929 -5.0 -2.0 2013-01-04 -0.721555 -0.706771 -1.039575 -5.0 -3.0 2013-01-05 -0.424972 -0.567020 -0.276232 -5.0 -4.0 2013-01-06 -0.673690 -0.113648 -1.478427 -5.0 -5.0
Pandas 2.2 中文官方教程和指南(七)(2)https://developer.aliyun.com/article/1509748