pandas Series 数据结构
Series 本质上是带 Index 的一维数组。值有数据类型(dtype),标签用于标识和对齐。这种基于标签的对齐机制,是它区别于普通 Python 列表或 NumPy 数组的关键所在。
import pandas as pd
scores = pd.Series(
[91, 84, pd.NA],
index=["Ada", "Lin", "Sam"],
name="score",
dtype="Int64",
)
核心概念
scores.array:底层数据存储。在适用场景下,使用 pandas 扩展数组(Extension Array)。scores.index:存储标签。标签可以是字符串、日期等,不必是连续整数。scores.name:序列名称。在转为 DataFrame 或参与表格操作时,通常作为列名。scores.dtype:决定数据的存储格式及缺失值处理方式。
注意:不要依赖 pandas 自动推断的 dtype。推断结果可能受输入数据或 pandas 版本影响。在处理字符串、可空整数、布尔值或日期时,若需特定表示,务必在创建时显式指定 dtype。
构造与对齐
根据需求选择构造方式:
- 顺序优先:从列表/序列构造。
- 标签优先:从字典/映射构造。
left = pd.Series({"a": 10, "b": 20})
right = pd.Series({"b": 1, "c": 2})
left + right
# 结果:a -> NA, b -> 21, c -> NA
left.add(right, fill_value=0)
# 结果:a -> 10, b -> 21, c -> 2
算术运算默认按标签对齐,而非按物理位置。这很强大,但如果两个 Series 的索引不一致,可能会静默产生缺失值。在索引关系至关重要时,建议先检查索引或显式处理对齐逻辑。
缺失值处理
判断缺失值请使用 isna() 和 notna(),严禁使用 == 进行相等比较。
缺失值的底层表示取决于 dtype,可能是 pd.NA、NaN 或 NaT。代码中应统一使用 pandas 提供的缺失值 API,不要直接依赖具体的标量哨兵值。
选型建议
- 用 NumPy:当任务纯粹是基于位置的同质数值计算时。
- 用 Series:当需要标签索引、可空数据类型、自动对齐或参与 pandas 表格操作时。