首页  >  文章  >  后端开发  >  为什么 Pandas 的 `s.replace` 基于字典的值替换速度很慢?

为什么 Pandas 的 `s.replace` 基于字典的值替换速度很慢?

DDD
DDD原创
2024-11-19 21:45:03518浏览

Why is Pandas' `s.replace` Slow for Dictionary-Based Value Replacement?

了解 Pandas 中 s.replace 和其他值替换方法之间的性能差距

使用字典替换 Pandas 系列中的值是一个共同任务。然而,与列表推导等替代方法相比,s.replace(此操作的推荐方法)通常表现出明显较慢的性能。

s.replace 缓慢的根本原因

s.replace 除了简单的字典映射之外还执行其他处理。它处理边缘情况和罕见情况,这需要更复杂和耗时的操作。具体来说,s.replace 将字典转换为列表,检查嵌套字典,并迭代列表以将键和值提供给单独的替换函数。这种开销会显着减慢流程。

优化值替换

要优化值替换,应遵循以下准则:

  • 当所有系列值都被字典键覆盖时,使用 s.map(d)。 s.map 在这种情况下表现出了出色的性能。
  • 当超​​过 5% 时使用 s.map(d).fillna(s['A']).astype(int)系列值由字典键覆盖。该方法结合了 s.map 的效率和处理缺失值的能力。
  • 当需要少量值(少于 5%)时使用 s.replace(d)被替换。在这种情况下 s.replace 相对较快。

基准测试

基准测试结果显示了各种替换方法之间的性能差异:

测试 1 - 完整地图

%timeit df['A'].replace(d)  # 1.98s
%timeit df['A'].map(d)      # 84.3ms
%timeit [d[i] for i in lst]  # 134ms

测试 2 - 部分地图

%timeit df['A'].replace(d)                  # 20.1ms
%timeit df['A'].map(d).fillna(df['A']).astype(int)  # 111ms
%timeit [d.get(i, i) for i in lst]                  # 243ms

这些结果清楚地表明 s.map 及其修改后version 的执行速度明显快于 s.replace,尤其是当字典键覆盖了大部分系列值时。

以上是为什么 Pandas 的 `s.replace` 基于字典的值替换速度很慢?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn