pandas apply 与向量化
pandas apply 与向量化
apply 很好用,但不应该成为处理每一列的默认方式。pandas 的优势在于向量化操作,能用内置字符串、数值、日期方法时,通常比逐行 apply 更快、更清晰。
我的原则是:先找向量化写法,找不到再考虑 apply。
向量化优先
df["name"] = df["name"].str.strip()df["amount"] = pd.to_numeric(df["amount"], errors="coerce")df["is_large"] = df["amount"] >= 1000这些操作不需要逐行函数,pandas 已经提供了专门的方法。
apply 适合什么场景
当逻辑确实依赖多列组合,且向量化表达过于绕时,可以用 apply(axis=1)。但要意识到它通常更慢,数据量大时需要重新设计。
def label(row): if row["amount"] >= 1000 and row["vip"] == 1: return "high_value" return "normal"
df["label"] = df.apply(label, axis=1)可以替代 apply 的写法
import numpy as np
df["label"] = np.where( (df["amount"] >= 1000) & (df["vip"] == 1), "high_value", "normal",)条件分支简单时,np.where 或 np.select 更适合。
判断标准
-
数据量很小,以可读性为主,可以接受 apply。
-
数据量很大,优先向量化或分块处理。
-
逻辑涉及外部 API 或文件 IO,不适合直接在 apply 里跑。
-
写完后用小样本手动验证几行结果。
实战复盘
写《pandas apply 与向量化》这类数据分析文章时,我会强制保留“检查点”。因为数据分析里最危险的不是报错,而是代码顺利跑完却得到错误结论。
一个合格的 pandas 步骤,至少要能回答:输入多少行、输出多少行、哪些字段被修改、失败值有多少、是否有样本可以人工复核。缺少这些信息,代码就很难进入正式流程。
如果以后把这些文章串成系列,可以按读取、检查、清洗、变换、统计、导出排列。这样读者能从原始数据一路走到可交付结果。
最小验收样例
验收《pandas apply 与向量化》时,我会手写一个三到五行的小 DataFrame:一行正常数据,一行缺失或异常数据,一行边界数据。先让示例在小表上跑通,再换成完整数据集。
小表的好处是结果可以人工计算。只要人工结果和 pandas 输出对不上,就说明代码逻辑或字段口径还没想清楚。这个过程比直接在大表上调试更可靠。
小结
apply 不是不能用,而是要知道它的成本。能向量化就向量化,复杂业务逻辑再用 apply 保持清晰。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!













