Pandas Series与DataFrame算术运算机制详解

纸上星河
纸上星河
发布时间:2026-10-11| 1人浏览过
原创

本文深入解析Pandas中Series与DataFrame的算术运算规则。重点阐述索引对齐机制,说明当索引不匹配时如何生成NaN值。同时详细讲解利用广播机制实现DataFrame与特定行或列的运算,包括指定axis参数的具体用法,帮助开发者掌握数据对齐与广播的核心逻辑。

核心运算机制:索引对齐

Pandas在进行算术运算时,最核心的特性是索引对齐(Index Alignment)。无论是Series与Series,还是DataFrame与DataFrame,运算都会基于索引标签进行匹配,而非单纯的位置对应。理解这一机制是避免数据计算错误的关键。

Series与Series运算

当两个Series进行加减乘除运算时,Pandas会尝试对齐它们的索引:

  • 对齐项相加:如果两个Series拥有相同的索引标签,对应位置的值会进行算术运算。
  • 不对齐项处理:如果某个索引仅存在于其中一个Series中,运算结果中该位置的值为 NaN。

以下代码演示了这一过程:

import numpy as np
import pandas as pd
from pandas import Series, DataFrame

# 创建两个索引不完全相同的Series
s1 = Series([1,3,5,7], index=['a','b','c','d'])
s2 = Series([2,4,6,8], index=['a','b','c','e'])

# 执行加法运算
result = s1 + s2
print(result)

运行结果如下:

a     3.0
b     7.0
c    11.0
d     NaN
e     NaN
dtype: float64

可以看到,索引 'a', 'b', 'c' 对应的值进行了相加(如 1+2=3),而仅存在于 s1 的 'd' 和仅存在于 s2 的 'e',由于无法对齐,结果均为 NaN。

DataFrame与DataFrame运算

DataFrame之间的算术运算同样遵循索引对齐原则,但维度更高。运算会在行索引和列索引两个维度上同时进行对齐:

  • 行和列都存在的交集部分进行计算。
  • 任意一个维度(行或列)找不到对应项,结果即为 NaN。

示例代码如下:

# 构建两个结构略有不同的DataFrame
data1 = {'水果':['苹果','梨','草莓'], '数量':[3,2,5], '价格':[10,9,8]}
data2 = {'数量':[3,2,5,6], '价格':[10,9,8,7]}
df1 = DataFrame(data1)
df2 = DataFrame(data2)

# 执行乘法运算
print(df1 * df2)

输出结果:

  价格 数量 水果
0 100.0 9.0 NaN
1 81.0 4.0 NaN
2 64.0 25.0 NaN
3 NaN NaN NaN

分析:df1 包含“水果”列,而 df2 没有,因此“水果”列在结果中全为 NaN。同时,df2 多出一行索引 3,该行在 df1 中不存在,故结果中第3行全为 NaN。

广播机制:DataFrame与Series的运算

当DataFrame与Series进行运算时,Pandas利用广播(Broadcasting)机制。但Series必须与DataFrame的某一维度(行或列)对齐,否则无法计算。

1. DataFrame与某行运算(默认行为)

当Series的索引与DataFrame的列名匹配时,Series会被视为一个“行向量”,并广播到DataFrame的每一行。这是默认行为,无需额外指定轴。

# 将df2的第0行数据广播到所有行
print(df2 + df2.iloc[0])

结果:

 价格 数量
0 20 6
1 19 5
2 18 8
3 17 9

这里,df2.iloc[0] 是一个Series,其索引为 ['价格', '数量'],与 df2 的列名完全一致。因此,该Series的值被加到了 df2 的每一行对应列上。

2. DataFrame与某列运算(需指定轴)

若要将Series与DataFrame的某一列进行运算,必须明确指定 axis=0。否则,Pandas会尝试将Series的索引与DataFrame的列名对齐(如前例),导致逻辑错误或结果不符合预期。

# 将df2的每一列减去第0列的值
print(df2.sub(df2.iloc[:,0], axis=0))

结果:

 价格 数量
0 0 -7
1 0 -7
2 0 -3
3 0 -1

关键点:df2.iloc[:,0] 提取的是第0列,其索引为DataFrame的行索引(0,1,2,3)。通过指定 axis=0,Pandas知道要将这个Series与DataFrame的每一行进行对齐运算(即按行索引匹配)。

3. 无法对齐的情况

如果Series的索引与DataFrame的列名完全不匹配,运算结果中将填充 NaN。

s = Series([1,1,1], index=['数量','价格','重量'])
print(df2 + s)

结果:

 价格 数量 重量
0 11 4 NaN
1 10 3 NaN
2 9 6 NaN
3 8 7 NaN

分析:s 包含“重量”索引,但 df2 没有“重量”列,因此“重量”列结果为 NaN。同时,s 的索引(数量、价格)与 df2 的列名匹配,所以“数量”和“价格”列正常计算。注意,这里没有指定 axis,Pandas默认尝试按列对齐,但由于Series索引与DataFrame列名一致,它实际上是将Series广播到了每一行(类似于前文的行运算逻辑,但这里Series索引是列名,所以是广播到行)。*修正说明:上述代码中,s的index是['数量','价格','重量'],df2的columns也是['数量','价格']。因此s与df2列名对齐,广播到各行。* 若希望按行索引对齐(即Series作为列向量),需指定 axis=0 且Series索引为行索引。

总结

掌握Pandas算术运算的关键在于理解索引对齐与广播机制:

  • Series + Series:基于索引标签对齐,缺失项为 NaN。
  • DataFrame + DataFrame:行列索引同时对齐,缺失项为 NaN。
  • DataFrame + Series:默认按列对齐(广播到行);若需按行对齐(广播到列),必须指定 axis=0。

通过合理运用这些机制,可以更高效地进行数据清洗与特征工程。以上就是Pandas Series与DataFrame算术运算机制的详细内容,更多关于Pandas数据处理技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。