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

