如果我运行以下代码:
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中搜索,但找不到它。
答案 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.isclose
与equal_nan=True
一起使用:
np.isclose(dft1, dft2, equal_nan=True, rtol=0, atol=0)
array([[ True],
[False],
[ True]])
重要的是将atol
和rtol
都设置为零,以避免对相似值进行相等声明。
答案 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