为何性能最差灵活性最低的Pandas applymap方法仍有使用场景?
我们来对比所有全场景适用的处理方法:
初始DataFrame:
import numpy as np import pandas as pd arr = np.random.randint(10, 50, size=(1000, 1000)) df = pd.DataFrame(arr)
Apply
%%timeit df.apply(lambda x: x**3)
运行结果:
329 ms ± 117 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Transform
%%timeit df.transform(lambda x: x**3)
运行结果:
352 ms ± 48 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Applymap(性能表现极差)
%%timeit df.applymap(lambda x: x**3)
运行结果:
1.07 s ± 59.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
问题解答
你看到的测试结果确实符合applymap的普遍表现,它之所以还被Pandas保留,主要有3个核心原因:
- 逐元素处理的场景适配性
apply、transform都是以行/列为单位传入数据,接收的参数是完整的Series对象,仅适配支持向量化运算的逻辑。但实际开发中经常会遇到只能接收单个标量值的处理函数:比如对每个元素做自定义类型校验、调用只能传单个值的第三方工具方法、对字符串/自定义对象做非向量化的属性读取等。这种场景下用applymap不需要额外在apply的逻辑里手动写循环遍历元素,代码写法最简洁直观。 - API设计的逻辑一致性
Pandas 1.x版本的API体系中,一维的Series结构已经提供了map方法实现逐元素处理,对应二维的DataFrame结构,推出applymap作为逐元素处理的方法,和Series的API形成对应关系,降低用户的学习理解成本。 - 向后兼容的需求
applymap从Pandas早期版本就已经存在,大量老旧项目、历史代码中都有使用,如果直接删除该方法会造成大规模的代码兼容性问题,属于破坏性极强的调整,Pandas开发组不会轻易做这类变更。
另外补充:从Pandas 2.1.0版本开始,applymap已经被官方标记为弃用,官方推荐直接使用DataFrame.map()方法替代它的逐元素处理能力,后续大版本更新中才可能会完全移除这个方法。
内容的提问来源于stack exchange,提问作者user17117975
相关产品推荐
相关产品推荐

