You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas中fillna与replace替换NaN哪个更快?join生成的NaN类型是什么?

Pandas Join生成的NaN类型与fillna/replace性能对比解答

1. Pandas的join方法生成的是哪种NaN?

Pandas的join方法生成的缺失值就是**np.nan**,可以通过以下方式验证:

  • 检查单个缺失值的类型:执行type(result['key_2'].iloc[1]),返回结果为numpy.float64(object类型列中存储的np.nan本质是numpy的浮点型NaN)。
  • 使用pandas原生缺失值判断:result['key_2'].isna()会将所有join不匹配的位置标记为True,而pandas的isna()方法默认兼容np.nan。
  • 补充说明:在pandas中,绝大多数生成缺失值的操作(包括join、merge、reindex等)默认填充np.nan;仅布尔类型列的缺失值会用pd.NA,你的示例中是object类型列,因此填充的是np.nan。

2. fillna与replace哪个执行速度更快?

fillna的执行速度远快于replace,核心原因在于两者的底层逻辑差异:

  • fillna是pandas专为缺失值处理优化的方法,底层直接针对缺失值的掩码(mask)定位操作,无需遍历所有元素做匹配判断,仅对缺失值位置进行填充。
  • replace是通用替换方法,需要遍历整个数据集,逐一检查每个元素是否等于目标值(此处为np.nan),即使仅替换NaN,也会对所有元素做比对,数据量越大,效率差距越明显。

性能测试示例

用timeit模块可直观验证两者的速度差异:

import pandas as pd
import numpy as np
import timeit

# 生成10万行的大样本数据
large_df = pd.DataFrame({'col': [np.nan if i%5==0 else f'val_{i}' for i in range(100000)]})

# 测试fillna平均耗时
fillna_avg_time = timeit.timeit(lambda: large_df.fillna('fill_val'), number=100) / 100
print(f"fillna平均耗时: {fillna_avg_time:.6f}秒")

# 测试replace平均耗时
replace_avg_time = timeit.timeit(lambda: large_df.replace(np.nan, 'replace_val'), number=100) / 100
print(f"replace平均耗时: {replace_avg_time:.6f}秒")

测试结果通常显示fillna的耗时仅为replace的1/3甚至更少,数据规模越大,差距越显著。

内容的提问来源于stack exchange,提问作者David Siret Marquès

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:17:23