Pandas列运算应优先使用向量化操作而非for循环,因底层基于NumPy、速度快且自动索引对齐;需注意类型转换、除零、空值及广播规则,关键运算后应校验结果。

列运算直接用 + - * / 就行,别写 for 循环
Pandas 的 Series 和 DataFrame 列天然支持向量化算术运算,底层走的是 NumPy,速度比 Python 循环快几十倍。写 df['a'] + df['b'] 是对齐索引后逐元素相加,不是按位置硬拼——这点容易误判结果。
- 索引不一致时会自动对齐,缺失位置填
NaN,不是报错也不是截断 - 想忽略索引、纯按位置算?用
df['a'].values + df['b'].values,但得自己确保长度一致 - 混合数据类型(比如一列是字符串)会触发隐式类型转换,可能得到意外的
object类型或报TypeError - 除法中遇到 0 会得
inf或nan,不是报错;需要安全除法时用np.divide(a, b, out=np.zeros_like(a, dtype=float), where=b!=0)
df.eval() 适合多列复合表达式,但有作用域限制
当要算 df['x'] * (df['y'] + df['z']) / df['w'] 这种带括号和多操作符的式子,df.eval() 比链式调用更简洁、内存更省,内部做了表达式解析和惰性计算。
- 变量名必须是列名或已定义的局部变量(传入
local_dict),不能用df['col']这种写法 - 不支持函数调用(如
sin(x)),除非显式注册到engine='numexpr'的命名空间里 - 默认引擎
'numexpr'快但不支持所有 NumPy 函数;切engine='python'就变慢,且失去短路求值优势 - 返回的是 Series 或标量,不是自动赋值回
df,记得写df['new'] = df.eval('x * y')
广播机制常被忽略:标量、列表、数组混用时行为不同
给一列加一个数(如 df['a'] + 5)是标量广播,没问题;但加一个长度不等的列表或数组,就容易出错。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 加
[1, 2]:如果df行数不是 2,直接报ValueError: operands could not be broadcast together - 加
np.array([1, 2]):同上,广播规则严格按 NumPy 规则,不自动填充或截断 - 想按行号加?用
df['a'] + np.arange(len(df)),前提是长度一致 - 想按某条件加不同值?别硬凑数组,用
np.where(df['flag'], 10, 5)构造条件数组再算
除零、空值、类型不匹配导致静默失败或结果污染
向量化运算不会因为某一行出问题就中断,而是让那一行结果变成 NaN 或 inf,后续统计(如 .mean())还可能默认跳过它们——你根本不知道中间已经“坏掉”了几行。
立即学习“Python免费学习笔记(深入)”;
-
df['a'] / df['b']中只要b有一行为 0,对应结果就是inf;全为 0 就全是inf -
df['a'].astype(str) + df['b']若b是数字,会触发字符串拼接,结果是'12345.0'这类,不是报错 - 检查空值影响:运算前用
df[['a','b']].isna().sum()看缺失情况,别依赖.dropna()后再算——那会丢数据 - 真要容错计算,优先用
pd.Series.div()等方法,它有fill_value和errors='ignore'参数,比操作符可控
实际写的时候,最麻烦的从来不是“怎么写对”,而是“怎么确认没算错”。尤其当列里混着空值、异常值、类型抖动时,一个 + 号下去,结果看着像那么回事,其实早就不对了。建议关键列运算后立刻跑一句 result.describe(include='all'),扫一眼 count、unique、top,比光看前五行管用。

















