动机
什么是 Pandas?
Pandas 是一个开源的 Python 数据处理库,它提供了一种高效的数据结构 DataFrame
(二维表格)和 Series
(一维数组),用于快速地处理和分析大型数据集。
Pandas 的主要功能包括数据清洗、数据转换、数据聚合和数据可视化等。它可以处理各种数据来源,例如 CSV 文件、Excel 文件、数据库、Web API 和 HTML 等。Pandas 可以轻松处理缺失值、重复值、异常值等常见数据问题,并提供了强大的数据合并、分组和透视功能,可以帮助用户快速地进行数据分析和挖掘。
Pandas 还提供了广泛的统计分析功能,例如描述性统计、假设检验、回归分析、时间序列分析等。此外,pandas 可以与其他 Python 数据科学库(例如 NumPy、Matplotlib)无缝集成,使用户能够轻松地构建数据科学工作流程。
为什么我要在 2023 年重新学习 Pandas?
起这样一个标题确实十分利好 SEO。
以前的我用 pandas——拿来读 CSV,当作 Python 的 dict
类型来使用。重复、丢失、异常数据全部手工处理;数据分析手动做或者让 matplotlib 来可视化;统计分析功能几乎不用……
所以,pandas 屁用没有,还不如直接用 csv
库都进来当 dict
用。
这种低效的方式不仅没有发挥 pandas 的作用,而且最重要的是十分浪费时间,把大量时间花在了特征工程和数据处理的最初阶段。
Pandas 相比于 csv+dict 的方式有以下好处:
- 更快的数据读写:pandas 使用 Cython 编写了高效的底层代码,能够快速地读取和写入数据,相比于 csv+dict 方式更快速;
- 更丰富的数据结构:pandas 提供了
DataFrame
和Series
两种数据结构,能够处理比较复杂的数据,例如多维数据、表格数据等,而 csv+dict 只能处理简单的键值对数据; - 更强大的数据操作:pandas 提供了大量的数据操作函数,包括数据清洗、转换、分组、聚合、排序等,可以快速地进行数据处理和分析,而 csv+dict 需要手动编写代码进行操作;
- 更完善的数据处理功能:pandas 支持缺失值处理、数据透视、数据合并等高级数据处理功能,这些功能可以大大减少数据处理的时间和难度,而 csv+dict 则需要手动编写代码实现这些功能。
为了提高效率,我决定重新学习一下 pandas,系统地补一补这几年在查 StackOverflow 的过程中漏下的内容。
创建 DataFrame
与 Series
一般将 pandas 库以 pd
的名称引入:
import pandas as pd
1. 创建 pandas 数据类型
DataFrame
和 Series
是 Pandas 两种主要的数据类型:*DataFrame
表示二维数据(表格)* ;*Series
表示一维数据(序列)*。
1.1 创建 DataFrame
表格
使用如下代码:
pd.DataFrame(
{
'Product': ['iPhone', 'iPad', 'macbook Pro'],
'Price': ['iPhone', '7999', '9999']
}
)
得到的数据为:
Product | Price | |
---|---|---|
0 | iPhone | 5499 |
1 | iPad | 7999 |
2 | macbook Pro | 9999 |
pd.DataFrame()
是构造函数,必须参数为一个 dict
,其中 key 是表头(字符串,记得加引号),对应的 value 是一个 list
,相当于列的数据。
其中,最左侧的列:[0, 1, 2]
是 index,也就是索引或者行号,默认情况下是 0, 1, 2, ...
。也可以通过参数 index
传入一个 list
来指定,比如:
pd.DataFrame(
{
'Product': ['iPhone', 'iPad', 'macbook Pro'],
'Price': ['iPhone', '7999', '9999']
},
index=['sku 1', 'sku 2', 'sku 3']
)
会得到:
Product | Price | |
---|---|---|
sku 1 | iPhone | 5499 |
sku 2 | iPad | 7999 |
sku 3 | macbook Pro | 9999 |
1.2 创建 Series
序列
Series
就是 DataFrame
中的一列。创建方式为:
pd.Series([5499, 7999, 9999])
就得到了
0 | 5499 |
1 | 7999 |
2 | 9999 |
在 Python 输出中一般显示为:
0 5499
1 7999
2 9999
dtype: int64
其中左侧是 index,而右侧就是 Series
的数据。可以看出,Series
表示单独的一列;而上面的这个 Series
缺少了列标,或者说,没有表头。我们可以在构造函数 pd.series()
中通过 name
参数增加表头:
pd.Series([5499, 7999, 9999], name="Price")
会得到
Price | |
---|---|
0 | 5499 |
1 | 7999 |
2 | 9999 |
在 Python 输出中一般显示为:
0 5499
1 7999
2 9999
Name: Price, dtype: int64
2. 从外部读取数据
由于 pandas 支持的数据主要是表格,因此,pandas 提供了对于个各种各样的表格的读写支持,包括但不限于:
- CSV
- Excel
- HTML/XML
- Latex
- SQL
- HDFS
- BigTable
- SAS
- SPAA
- 剪切板
- …
其中,最常用的是 csv 格式。完整的 I/O 文档在 Input/output – pandas documentation 中。
2.1 从 .csv
文件中读取表格
# 读取 ./table.csv 中的数据到 data_frame 中
data_frame: pd.DataFrame = pd.read_csv("./table.csv")
CSV 格式的分隔符是逗号 ,
。也可以通过参数 sep
来指定分隔符种类。
2.2 将 DataFrame
写入到 .csv
文件中
# 将 data_frame 中的数据写入到 ./written_table.csv
data_frame.to_csv("./written_table.csv")