95%以上的for循环场景可用向量化操作替代;因for循环绕过Pandas的NumPy/C内核,触发逐行解释开销,而np.where、pd.cut、str方法、列运算等可批量执行。

直接结论:95% 以上的 for 循环场景,都能用向量化操作替代;强行保留循环或滥用 .apply() 是性能瓶颈的主因,不是“写法习惯问题”,而是对 Pandas 底层机制的误判。
为什么 for 循环在 Pandas 里特别慢
Python 解释器逐行执行 for i in range(len(df)): 时,每次访问 df.loc[i, 'col'] 都触发完整索引解析、类型检查和内存寻址。数据量过万,开销就指数级上升。更关键的是,这种写法完全绕过了 Pandas 基于 NumPy 的 C/Fortran 向量化内核——你不是在“用 Pandas”,而是在用 Python 拿 Pandas 当容器使。
-
df.iterrows()和df.itertuples()本质仍是 Python 层循环,仅比.loc稍快,但不解决根本问题 -
.apply(func, axis=1)不是向量化,它只是把for循环藏起来了,底层仍是一行一行传参调用 Python 函数 - 真正向量化 = 所有计算由 NumPy/C 引擎批量完成,零 Python 解释器介入
常见场景的向量化替代写法
别想“怎么把我的 for 写成 apply”,先问:“这个逻辑能不能用数组运算表达?” 大部分能。
- 条件赋值:用
np.where(df['age'] > 30, 'adult', 'young'),不是for+if - 分段打标:用
pd.cut(df['score'], bins=[0,60,80,100], labels=['F','C','A']),不是循环判断区间 - 字符串处理:用
df['name'].str.upper(),不是.apply(str.upper)(后者对 NaN 报错,前者自动跳过) - 数值计算:用
df['A'] + df['B'] * 2,不是for中逐行算再赋值 - 时间偏移:用
df['date'] + pd.Timedelta('7D'),不是循环构造datetime对象再加
merge + combine_first 替代条件更新循环
当你需要按多列匹配规则表来修正原始数据(比如 Excel 里一堆“如果 A=1 且 B='x',则 C 改为 99”),千万别写 for idx, row in KORR.iterrows(): df.loc[(df['A']==row['A']) & (df['B']==row['B']), 'C'] = row['C']——每轮都要全表扫描布尔索引,百条规则就能让十万行 DataFrame 卡死。
librosa 是一个用于音频和音乐分析的 Python 库。它提供了特征提取、频谱分析、节拍跟踪、起始检测和音频可视化的工具,基于 NumPy 和 SciPy 构建,用于科学音频计算。
- 正确做法是:用
pd.merge(df, KORR, how='left', on=['A','B'])一次对齐所有匹配项 - 再用
df['C'] = df['C_new'].combine_first(df['C'])完成“有新值则覆盖,无则保留原值” - 注意:
KORR中的修正列名必须与原列不同(如叫'C_new'),否则merge会自动后缀_x/_y,破坏逻辑 -
combine_first对 NaN 敏感,确保修正列缺失值确实是NaN,不是空字符串或占位符
apply 什么时候可以接受
.apply() 不是敌人,但它是“最后选项”。只有当逻辑无法拆解为纯数组运算、且函数本身足够轻量时,才考虑它,并优先用 raw=True 和 axis=0。
- 列级简单映射(如
df['code'].apply(lambda x: mapping.get(x, 'unknown')))可接受,因为map()更快,但apply也凑合 - 避免
axis=1:除非你确认函数内部没调用任何 Pandas 方法(如row['A'] + row['B']可以,但row.sum()就不行) -
raw=True能让.apply()传入 NumPy 数组而非Series,减少对象封装开销,提速明显 - 永远别在
.apply()里做 I/O、网络请求、复杂 if-else 堆叠——那已经不是数据处理,是业务脚本了
最常被忽略的一点:向量化不是“语法替换”,而是思维切换——从“我怎么处理这一行”,变成“整个列满足什么数学/逻辑关系”。一旦卡在某个操作上想不出向量化写法,大概率是该操作本身设计不合理,或者该用 pd.cut、np.select、groupby().transform() 这些更专用的原语,而不是硬套 apply。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










