跳到主要内容

Series 的选择与转换

明确的选择方式

import pandas as pd

s = pd.Series([90, 80, 70], index=["Ada", "Lin", "Sam"], dtype="float64")
s.loc["Ada"] # 单个标签
s.loc[["Ada", "Sam"]] # 多个标签
s.iloc[0] # 第一个位置
s.iloc[:3] # 前三个位置
s[s.ge(80)] # 布尔筛选

处理标签用 .loc,处理位置用 .iloc。特别是当索引本身是整数时,混用容易出错。虽然 s[key] 在标签无歧义时更简洁,但显式使用索引器能更清晰地表达意图,且在索引结构变化时更稳健。

转换操作的优先级

  1. 优先使用原生向量化算术,或字符串/日期时间访问器。
  2. 标量查找或逐元素函数使用 map
  3. 条件替换使用 wheremaskreplacefillna
  4. 仅当没有更清晰的向量化操作时,才使用 apply
normalized = (s - s.mean()) / s.std()
bands = s.map({90: "A", 80: "B"})
clipped = s.clip(lower=0)

注意:map 传入字典时,未匹配的值会变成缺失值(NaN)。如果希望未匹配的值保持原样,请使用 replace

合并 Series

使用 pd.concat 进行纵向堆叠或横向拼接:

train, test = s.iloc[:2], s.iloc[2:]
actual, predicted = s, s + 5
stacked = pd.concat([train, test], ignore_index=True)
table = pd.concat([actual.rename("actual"), predicted.rename("predicted")], axis=1)

Series.append 已废弃,不是标准的合并 API。在进行列向拼接(axis=1)前,务必确认是否期望按标签对齐。

迭代

如果确实必须迭代,s.items() 会生成 (标签, 值) 对。 切勿使用迭代进行算术运算或常规筛选;向量化表达式不仅更清晰,性能通常也更好。

结果与统计假设

本例中,s.loc["Ada"] 返回标量 90.0,选择两个标签返回长度为 2 的 Series,筛选保留 Ada 和 Lin。转换操作返回新的 Series,不修改 sbands 依次为 "A""B" 和缺失值;它按数值精确查表,不是按分数区间划档。

Series.std 默认使用样本分母(ddof=1),因此均值为 80,标准差为 10,normalized[1.0, 0.0, -1.0]。总体标准差用 ddof=0。常量序列的标准差为零;有效值少于两个时,样本标准差无法定义。除法前应明确这些情况如何处理。

参考资料

探索关联打开关联网络