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
相关产品推荐
相关产品推荐

