2023 年复习 Pandas 教程(一):DataFrame 与 Series

动机

什么是 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 的方式有以下好处:

  1. 更快的数据读写:pandas 使用 Cython 编写了高效的底层代码,能够快速地读取和写入数据,相比于 csv+dict 方式更快速;
  2. 更丰富的数据结构:pandas 提供了 DataFrameSeries 两种数据结构,能够处理比较复杂的数据,例如多维数据、表格数据等,而 csv+dict 只能处理简单的键值对数据;
  3. 更强大的数据操作:pandas 提供了大量的数据操作函数,包括数据清洗、转换、分组、聚合、排序等,可以快速地进行数据处理和分析,而 csv+dict 需要手动编写代码进行操作;
  4. 更完善的数据处理功能:pandas 支持缺失值处理、数据透视、数据合并等高级数据处理功能,这些功能可以大大减少数据处理的时间和难度,而 csv+dict 则需要手动编写代码实现这些功能。

为了提高效率,我决定重新学习一下 pandas,系统地补一补这几年在查 StackOverflow 的过程中漏下的内容。

创建 DataFrameSeries

一般将 pandas 库以 pd 的名称引入:

import pandas as pd

1. 创建 pandas 数据类型

DataFrameSeries 是 Pandas 两种主要的数据类型:*DataFrame 表示二维数据(表格)* ;*Series 表示一维数据(序列)*。

1.1 创建 DataFrame 表格

使用如下代码:

pd.DataFrame(
    {
        'Product': ['iPhone', 'iPad', 'macbook Pro'],
        'Price': ['iPhone', '7999', '9999']
    }
)

得到的数据为:

 ProductPrice
0iPhone5499
1iPad7999
2macbook Pro9999

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']
)

会得到:

 ProductPrice
sku 1iPhone5499
sku 2iPad7999
sku 3macbook Pro9999

1.2 创建 Series 序列

Series 就是 DataFrame 中的一列。创建方式为:

pd.Series([5499, 7999, 9999])

就得到了

  
05499
17999
29999

在 Python 输出中一般显示为:

0    5499
1    7999
2    9999
dtype: int64

其中左侧是 index,而右侧就是 Series 的数据。可以看出,Series 表示单独的一列;而上面的这个 Series 缺少了列标,或者说,没有表头。我们可以在构造函数 pd.series() 中通过 name 参数增加表头:

pd.Series([5499, 7999, 9999], name="Price")

会得到

 Price
05499
17999
29999

在 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")

发表评论