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

Python中如何比较两个DataFrame且不参与空值比较?

如何在DataFrame比较时保留NaN的位置?

我明白你的需求——默认的df1 > df2会把任何涉及NaN的比较结果直接转成False,但你希望原DataFrame里是NaN的位置,比较结果也保留为NaN对吧?这可以通过几种简单的方法实现:

方法1:用numpy.where精准控制结果

我们可以先做常规的布尔比较,再用np.where把原df2(或者同时包含df1)中NaN的位置替换成NaN:

import numpy as np
import pandas as pd

# 你的原始数据
df1 = pd.DataFrame({'a': [1,2,3,4,5], 'b': [2,3,4,5,6], 'c': [6,7,8,9,10]})
df2 = pd.DataFrame({'a': [np.nan,1.0,2.0,4.0,6.0], 'b': [np.nan,np.nan,2.0,3.0,6.0], 'c': [np.nan,np.nan,np.nan,np.nan,11.0]})

# 生成符合预期的结果
comparison_result = pd.DataFrame(
    np.where(df2.isna(), np.nan, df1 > df2),
    columns=df1.columns
)

print(comparison_result)

输出完全符合你的预期:

a    b     c
0  NaN  NaN   NaN
1  True  NaN   NaN
2  True  True  NaN
3 False  True  NaN
4 False False False

如果你的场景中df1也可能存在NaN,可以把判断条件改成df1.isna() | df2.isna(),这样只要任意一个DataFrame该位置是NaN,结果就保留NaN。

方法2:用mask函数更简洁实现

pandas的mask方法可以帮我们快速替换满足条件的位置,代码更短:

comparison_result = (df1 > df2).mask(df2.isna())

这个方法的逻辑是:先得到df1 > df2的布尔结果,然后把所有df2中是NaN的位置,替换成NaN,效果和方法1完全一样。

避坑提醒:别用gt的fill_value参数

可能你会想到用df1.gt(df2, fill_value=xxx),但这个参数是先填充NaN再比较,而不是保留原NaN位置,比如填充成负无穷后,NaN位置的比较结果会变成True,不符合你的需求,所以别用这个参数来实现你的场景。


内容的提问来源于stack exchange,提问作者Tan Tu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:54:35