含NaN值的两个DataFrame实现按行SUMPRODUCT运算的高效方案
问题原因
你现有代码返回NaN的核心原因是:NumPy中NaN与任意数值运算结果仍为NaN,求和时不会自动忽略这类异常值。
可行实现方案
两种高效的矢量化实现方式,均满足NaN按0处理的要求,性能远高于循环遍历:
方法1:Pandas原生fillna处理(推荐,可读性最高)
直接用fillna(0)先把两个DataFrame里的空值替换为0,再做乘积累加:
df['z'] = (df['x'].fillna(0) * df['y'].fillna(0)).sum(axis=1)
针对你的示例数据计算结果如下:
- 第一行:
2*2 +5*3 +9*4 = 55 - 第二行:
0*2 +4*2 +7*3 = 29 - 第三行:
3*1 +0*2 +3*3 = 12
方法2:NumPy nan_to_num处理(大内存数据下性能略优)
如果数据量极大(百万行以上),用NumPy的nan_to_num直接在数组层面替换空值,内存开销更低:
import numpy as np df['z'] = (np.nan_to_num(df['x']) * np.nan_to_num(df['y'])).sum(axis=1)
内容的提问来源于stack exchange,提问作者JoshZ
相关产品推荐
相关产品推荐

