DevCN
菜单
讨论动态发现圈子我关注的我的收藏
# Python

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。

下载推广海报

圈内讨论推广海报

《apply、map、applymap、向量化运算怎么选?为什么 apply 慢?》完整推广海报
REPLIES

回复

0 条回复
暂无回复。