df.apply(func, axis=1)慢因Python逐行迭代及Series构造开销;应优先用向量化表达式(如df['a']+df['b']*2),必要时用raw=True、提前列提取或np.select替代。

为什么df.apply(func, axis=1)慢得反常?
因为默认触发 Python 层逐行迭代,哪怕 func 内部只做几个算术运算,也会被 Pandas 封装成 Series 对象传入——构造开销大、类型检查多、无法向量化。实测 10 万行数据下,纯 NumPy 向量化比 axis=1 快 5–20 倍,取决于函数复杂度。
常见误用:df.apply(lambda row: row['a'] + row['b'] * 2, axis=1) —— 完全可以用 df['a'] + df['b'] * 2 替代,后者底层走的是 C 实现的数组广播。
- 优先检查能否用原生 Pandas/NumPy 表达式替代(加减乘除、
np.where、df.clip等) - 若必须用逻辑分支或调用外部库函数(如
math.log),再考虑apply或更优方案 -
axis=1下传入的row是pd.Series,索引对齐但访问比字典慢;用row.iloc[0]比row['col_name']略快,但提升有限
用 np.vectorize 包裹自定义函数真能加速吗?
不能。它只是语法糖,底层仍是 Python 循环,甚至因额外封装层略慢于原生 apply。别被名字误导。
真正有效的替代是:numba.jit(需重写为纯数值函数)或直接用 np.select/np.piecewise 拆解条件逻辑。例如实现分段计算:
conditions = [df['x'] = 0) & (df['x'] = 10] choices = [df['x'] * 2, df['x'] ** 2, np.log(df['x'] + 1)] df['result'] = np.select(conditions, choices, default=np.nan)
-
np.select支持任意列组合条件,且全程不脱离 NumPy 数组 - 所有
conditions和choices必须同长度,布尔数组用&(不是and)连接 - 若逻辑含字符串操作或 Pandas 特有方法(如
.str.contains),仍需apply,但可配合result_type='expand'预分配结果结构
当必须用 apply 时,怎么减少开销?
核心原则:让每一步都尽可能贴近底层数组操作,避免在循环内反复触发 Pandas 方法。
- 提前提取所需列:用
df[['a', 'b', 'c']].apply(..., axis=1),而非全量df.apply(...),减少内存拷贝 - 用
raw=True参数:使apply直接传入numpy.ndarray而非Series,访问速度提升约 30%;此时需按位置索引:row[0] + row[1] * 2 - 避免在函数内调用
df.loc、df.query等全局操作——它们会重建索引,完全抵消加速效果 - 若返回多列,用
result_type='expand'显式声明,比返回元组再pd.DataFrame拆解快
跨列计算遇到 SettingWithCopyWarning 怎么办?
这不是性能问题,但常和 apply 场景共存:你在视图(view)上尝试赋值,Pandas 不确定是否该修改原数据。
librosa 是一个用于音频和音乐分析的 Python 库。它提供了特征提取、频谱分析、节拍跟踪、起始检测和音频可视化的工具,基于 NumPy 和 SciPy 构建,用于科学音频计算。
最稳妥做法是显式复制或使用 .loc 定位:
# 错误(可能警告且不生效) df['new_col'] = df.apply(..., axis=1) <h1>正确(确保写入原 DataFrame)</h1><p>df.loc[:, 'new_col'] = df[['a', 'b']].apply(lambda x: x['a'] + x['b'], axis=1)</p><h1>或强制副本(适合后续要独立处理的场景)</h1><p>df_new = df.copy() df_new['new_col'] = df_new[['a', 'b']].apply(..., axis=1)</p>
注意:即使用了 .loc,如果 df 本身是切片得来(如 df_sub = df[df['flag']] ),仍可能触发警告——这时必须用 .copy()。
跨列计算本身不难,难的是在向量化、可读性、内存安全之间找平衡点。越早把逻辑拆成 NumPy 原语,后期维护和提速的空间越大。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










