map仅用于Series,擅长字典映射;apply可作用于Series或DataFrame,行为依axis而异;applymap仅用于DataFrame,逐元素操作。

map 只能用在 Series 上,且最擅长字典映射
如果你有一列数据要按规则替换成新值(比如把数字 1 → "东"、2 → "南"),map 是最直接的选择。它只接受 Series,不支持 DataFrame;传入字典时会自动做 key 查找,但要求类型严格匹配——df["toward"].map({1: "东"}) 对 "1"(字符串)无效,必须写成 {"1": "东"} 或先转类型。
常见错误现象:KeyError 或返回全 NaN,往往是因为 key 类型不一致或含空值未处理。
-
map遇到缺失值默认返回NaN,加参数na_action="ignore"可跳过 - 不能传额外参数,函数只能接收单个元素(如
lambda x: x.strip()) - 不支持多列操作,想对多列用映射得循环写或改用
replace
apply 既可作用于 Series 也可作用于 DataFrame,但行为完全不同
apply 在 Series 上类似 map(逐元素调用),但在 DataFrame 上默认按列(axis=0)把整列当 Series 传给函数;设 axis=1 则按行传整行。关键点:它传的是 Series 或 Series 子集,不是单个标量。
使用场景举例:计算每列均值、对某几列联合做归一化、按行拼接字段。
- 传函数时可带额外参数,比如
df["age"].apply(lambda x, bias: x + bias, args=(-3,)) -
DataFrame.apply(len)返回每列长度,不是每个单元格长度——容易误判为 element-wise - 性能上比
map或applymap慢,因为涉及对象构造和索引维护
applymap 只用于 DataFrame,且只对每个元素生效
applymap 的目标非常明确:把函数作用于 DataFrame 的**每一个值**,不管行列结构。它不关心索引、列名,只做纯元素级运算,类似 NumPy 的向量化操作但更灵活。
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
典型用途:统一格式化所有数字列(加单位)、对全部字符串调用 strip()、批量类型转换。
- 仅支持
DataFrame,对Series调用会报AttributeError - 无法区分列类型,如果 DataFrame 混合了数值和字符串,
applymap(str.upper)对数字会报错 - 内部是 Python 循环,大数据量时明显慢于向量化操作(如
df.astype(str).applymap(str.upper)不如df.select_dtypes("object").applymap(str.upper))
选哪个?看输入对象和操作粒度
别记口诀,直接查对象类型和需求:
- 单列替换映射 → 优先
map(快、语义清) - 单列复杂计算(需额外参数/条件分支)→
applyonSeries - 整行/整列统计或跨列逻辑 →
applyonDataFramewithaxis=0oraxis=1 - 所有单元格统一处理(且类型一致)→
applymap;否则考虑select_dtypes+applymap组合
最容易被忽略的点:三者都不自动处理混合类型 DataFrame 中的异常类型,出错时往往只报第一处,得自己提前过滤或用 try/except 包裹函数。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










