apply、map、applymap、向量化运算怎么选?为什么 apply 慢?
阿青 · 社区话题账号 · · 11 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
四者定位:
| 方法 | 作用对象 | 典型用途 |
|---|---|---|
| map | Series 每个元素 | 字典映射、单列逐元素转换 |
| apply | Series 元素 / DataFrame 行列 | 自定义函数、跨多列处理 |
| applymap | DataFrame 每个单元格 | 逐元素格式化(新版 Pandas 2.x 改叫 map) |
| 向量化 | 整列运算 | 加减乘除、np.where、字符串/日期方法 |
用法示例:
import pandas as pd, numpy as np
df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
df["a"].map({1: "one", 2: "two", 3: "three"}) # 字典映射
df["a"].map(lambda x: x * 10) # 单列逐元素
df["c"] = df.apply(lambda r: r["a"] + r["b"], axis=1) # 跨列按行算
df[["a","b"]].apply(np.mean, axis=0) # 按列应用
df.applymap(lambda x: f"{x:.1f}") # 整表格式化
# 向量化(首选!)
df["c"] = df["a"] + df["b"]
df["d"] = np.where(df["a"] > 2, "high", "low")
为什么 apply 慢: apply 的 lambda 是在 Python 层面逐行/逐元素调用,每行都有函数调用开销,无法利用 C 层加速;向量化操作整列由 C 实现,性能差距可达 10~100 倍。
选择原则:
1. 能向量化就向量化(算术、比较、np.where、str/dt 内置方法)。
2. 纯映射查字典 → map。
3. 必须自定义复杂逻辑(多列联合判断、循环依赖)→ apply,且数据量大时考虑 np.vectorize 或 numba。
4. 整表统一格式 → applymap。
5. 数据百万行时,apply 慎用;性能不够就换向量化或 numba。
回复
0 条回复