0Pricing
Pandas & NumPy Academy · 课时

Series 上的向量化运算

在两个 Series 之间执行算术运算,自动处理索引对齐,并用 NaN 填充对齐后缺失的值。

Series 上的向量化运算 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。

为什么使用向量化操作

与 NumPy 一样,Pandas Series 支持向量化操作,可以对每个元素执行算术运算、比较和函数调用,而无需使用 Python 循环。这既简洁又高效。在底层,每个操作都会调用 NumPy 的 C 级例程,但 Pandas 还提供了一个关键优势:在执行操作前自动对齐索引。

import pandas as pd

revenue = pd.Series([1000, 2000, 1500], index=['Jan', 'Feb', 'Mar'])
tax_rate = 0.2
net = revenue * (1 - tax_rate)   # vectorized -- no loop
print(net)

两个 Series 之间的算术运算

对两个 Series 进行加、减、乘或除时,Pandas 会先根据索引标签对齐它们。只有两个 Series 都包含的标签位置才会产生结果;不匹配的标签会产生 NaN。这种行为可以避免因数据未对齐而产生的隐蔽错误——例如,将两个数据源中顺序不同的 1 月数据相加。

import pandas as pd

a = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
b = pd.Series([1, 2, 3], index=['y', 'z', 'w'])

print(a + b)
# w     NaN
# x     NaN
# y    21.0
# z    32.0

在对齐操作中填充 NaN

要避免未对齐操作中的 NaN 传播,请使用 .add()、.sub()、.mul() 和 .div() 等算术方法,并配合 fill_value= 参数。该参数会在执行运算前,用指定值替换某个 Series 中缺失的标签;加法中通常使用 0,乘法中通常使用 1。

import pandas as pd

a = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
b = pd.Series([1, 2, 3], index=['y', 'z', 'w'])

result = a.add(b, fill_value=0)
print(result)
# w     3.0
# x    10.0
# y    21.0
# z    32.0

Series 上的标量算术运算

与标量进行算术运算时,操作会应用于每个元素,并生成一个索引不变的新 Series。这是最简单的向量化形式:s + 5、s * 100、s ** 2。标量算术不会引入 NaN,常用于单位转换、归一化和对时间序列进行偏移。

import pandas as pd

prices_eur = pd.Series([1.0, 2.5, 4.0], index=['a', 'b', 'c'])
exchange = 1.08
prices_usd = prices_eur * exchange
print(prices_usd.round(2))
# a    1.08
# b    2.70
# c    4.32

对 Series 应用 NumPy 通用函数

NumPy 通用函数可以无缝作用于 Pandas Series,并返回索引相同的 Series。这意味着您可以直接对 Series 调用 np.sqrt(s)、np.log1p(s) 或 np.exp(s),无需先将其转换为数组。结果是一个新的 Series,并保留原始标签。

import pandas as pd
import numpy as np

s = pd.Series([0, 1, 4, 9, 16], index=list('abcde'))
print(np.sqrt(s))
# a    0.0
# b    1.0
# c    2.0
# d    3.0
# e    4.0

Series 上的比较运算

比较运算符(==、!=、>、<、>=、<=)会逐元素返回布尔 Series。它们是筛选操作的基础:您可以将布尔 Series 传给 .loc,以选择符合条件的行。比较两个 Series 时,Pandas 也会按索引进行对齐。

import pandas as pd

s = pd.Series([3, 7, 2, 9, 1], index=list('abcde'))
print(s > 4)
# a    False
# b     True
# c    False
# d     True
# e    False
print(s[s > 4])  # b:7  d:9

串联向量化操作

由于每个操作都会返回一个新的 Series,您可以在一个表达式中串联多个转换。这种写法可读性好,也能避免创建不必要的中间变量。对于复杂的管道,请使用括号将串联操作分到多行。串联操作相当于 Pandas 中使用不可变数据进行函数式编程。

import pandas as pd
import numpy as np

raw_scores = pd.Series([55, 80, 45, 90, 72])
normalised = (raw_scores - raw_scores.min()) / (raw_scores.max() - raw_scores.min())
print(normalised.round(2))
# 0    0.22
# 1    0.78
# 2    0.00
# 3    1.00
# 4    0.60

处理向量化操作中的 NaN

NaN 具有传染性:任何涉及 NaN 的算术运算都会产生 NaN。请使用 s.fillna(value) 在运算前进行替换,或在聚合方法中使用 skipna=True 参数。pd.isna(s) 函数会返回一个布尔 Series,标记 NaN 所在的位置;您可以用它在计算统计数据前检查数据。

import pandas as pd
import numpy as np

s = pd.Series([1.0, np.nan, 3.0, np.nan, 5.0])
print(s + 10)
# 0    11.0  2    13.0  4    15.0 -- NaN stays NaN

print(s.fillna(0) + 10)
# 0    11.0  1    10.0  2    13.0  3    10.0  4    15.0

Series 上的 abs()、clip() 和 round()

Pandas Series 直接提供了许多类似 NumPy 的方法:s.abs()、s.clip(lower, upper) 和 s.round(decimals) 都会返回应用了逐元素转换的新 Series。它们等价于调用 NumPy 通用函数,但采用方法语法,并保留 Series 的索引和名称。

import pandas as pd

s = pd.Series([-2.5, 1.3, -0.7, 4.9, -3.1])
print(s.abs())          # [2.5 1.3 0.7 4.9 3.1]
print(s.clip(-2, 2))    # [-2.  1.3 -0.7  2. -2. ]
print(s.round(0))       # [-2.  1.  -1.   5.  -3.]

使用 pct_change() 计算增长率

s.pct_change() 计算连续元素之间的百分比变化:(当前值 - 前一个值)/ 前一个值。第一个元素为 NaN,因为它没有前一个值。这是计算环比增长率、金融领域每日收益率以及时间序列模型变化率特征的标准操作。

import pandas as pd

monthly_revenue = pd.Series([100, 120, 110, 140],
                            index=['Q1', 'Q2', 'Q3', 'Q4'])
growth = monthly_revenue.pct_change()
print(growth.round(3))
# Q1      NaN
# Q2    0.200
# Q3   -0.083
# Q4    0.273

Series 上的 cumsum() 和 cumprod()

s.cumsum() 返回累计总和 Series,s.cumprod() 返回累计乘积 Series。它们可用于计算累计收入、复合投资收益或累计词数。它们会保留原始索引标签,因此可以轻松按时间或类别绘制累计序列。

import pandas as pd

daily_sales = pd.Series([100, 150, 80, 200],
                        index=['Mon', 'Tue', 'Wed', 'Thu'])
print(daily_sales.cumsum())
# Mon    100
# Tue    250
# Wed    330
# Thu    530

快速检查

请测试您对本课中 Series 向量化操作的理解。

课程回顾

本课中您学习了:算术运算符可以在不使用循环的情况下逐元素应用于 Series;Pandas 会在运算前自动按索引标签对齐两个 Series,并在不匹配的位置放置 NaN;以及fill_value、pct_change 和 cumsum 等方法可以将向量化操作扩展到分析任务中。接下来,我们将学习 describe、value_counts 和 map 等实用的 Series 方法,以快速汇总数据。

常见问题解答

「Series 上的向量化运算」课时是免费的吗?

是的 — 「Series 上的向量化运算」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。

「Series 上的向量化运算」这节课中我会学到什么?

在两个 Series 之间执行算术运算,自动处理索引对齐,并用 NaN 填充对齐后缺失的值。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Pandas & NumPy Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「Series 上的向量化运算」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?

能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 创建 Series
  2. 基于标签与基于位置的访问
  3. Series 上的向量化运算
  4. 实用的 Series 方法
← 返回 Pandas & NumPy Academy