[英]Element-wise comparison with NaNs as equal
如果我運行以下代碼:
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。
我認為這是基本的功能,我一定要問一個重復的問題,但是我花了很多時間在搜索引擎優化或谷歌中找不到它。
想不出一個已經為你做過的功能(很奇怪)所以你可以自己做:
dft1.eq(dft2) | (dft1.isna() & dft2.isna())
a
0 True
1 False
2 True
注意括號的存在。 在pandas中使用重載的按位運算符時,優先級是需要注意的事項。
另一個選擇是使用np.nan_to_num
,如果您確定兩個DataFrame的索引和列是相同的,那么此結果是有效的:
np.nan_to_num(dft1) == np.nan_to_num(dft2)
array([[ True],
[False],
[ True]])
np.nan_to_num
用一些填充值填充NaNs(數字為0,字符串數組為'nan')。
使用np.isclose
和equal_nan=True
:
np.isclose(dft1, dft2, equal_nan=True, rtol=0, atol=0)
array([[ True],
[False],
[ True]])
將atol
和rtol
設置為零以避免類似值上的相等斷言非常重要。
由於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
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.