与NaN相等的元素明智比较

时间:2018-08-30 18:49:38

标签: python pandas numpy dataframe nan

如果我运行以下代码:

dft1 = pd.DataFrame({'a':[1, np.nan, np.nan]})
dft2 = pd.DataFrame({'a':[1, 1, np.nan]})
dft1.a==dft2.a

结果是

0     True
1    False
2    False
Name: a, dtype: bool

如何使结果成为

0     True
1    False
2     True
Name: a, dtype: bool

即np.nan == np.nan的值为True。

我认为这是基本功能,我必须问一个重复的问题,但是我花了很多时间在SO或Google中搜索,但找不到它。

4 个答案:

答案 0 :(得分:8)

想不出一个已经为您做到的功能(很奇怪),所以您可以自己完成:

dft1.eq(dft2) | (dft1.isna() & dft2.isna())

       a
0   True
1  False
2   True

请注意括号的存在。在熊猫中使用重载按位运算符时,要优先考虑优先事项。

另一种选择是使用np.nan_to_num,如果您确定两个DataFrame的索引和列都相同,那么此结果是有效的:

np.nan_to_num(dft1) == np.nan_to_num(dft2)

array([[ True],
       [False],
       [ True]])

np.nan_to_num用一些填充值(数字为0,字符串数组为'nan')填充NaN。

答案 1 :(得分:5)

np.iscloseequal_nan=True一起使用:

np.isclose(dft1, dft2, equal_nan=True, rtol=0, atol=0)

array([[ True],
   [False],
   [ True]])

重要的是将atolrtol都设置为零,以避免对相似值进行相等声明。

答案 2 :(得分:4)

由于np.nan不等于np.nan

np.nan==np.nan
Out[609]: False



dft1.a.fillna('NaN')==dft2.a.fillna('NaN')
Out[610]: 
0     True
1    False
2     True
Name: a, dtype: bool

答案 3 :(得分:1)

np.nan被定义为不等于np.nan

迭代

检查每个对是否相等全部np.nan

def naneq(t):
  return (t[0] == t[1]) or np.isnan(t).all()

[*map(naneq, zip(dft1.a, dft2.a))]

[True, False, True]

nunique

计算唯一值。确保设置参数dropna=False

pd.concat([dft1, dft2], axis=1).nunique(1, 0) == 1

0     True
1    False
2     True
dtype: bool