在NumPy和Pandas中,nan != nan
和NaT != NaT
。因此,在单元测试期间比较结果时,如何断言返回值是其中一个值?即使我使用assertEqual
,简单的pandas.util.testing
也会自然失败。
答案 0 :(得分:5)
如果您要比较标量,一种方法是将assertTrue
与isnull
一起使用。例如,在DataFrame单元测试(pandas/tests/test_frame.py
)中,您可以找到tests such as this:
self.assertTrue(com.isnull(df.ix['c', 'timestamp']))
(com
是pandas/core/common.py
的别名,因此com.isnull
调用与pd.isnull
相同的基础函数。)
另一方面,如果您将系列或数据框架与空值进行比较以获得相等性,则tm.assert_series_equal
和tm.assert_frame_equal
会自动处理这些问题。例如:
>>> import pandas.util.testing as tm
>>> df = pd.DataFrame({'a': [1, np.nan]})
>>> df
a
0 1
1 NaN
通常,NaN
不等于NaN
:
>>> df == df
a
0 True
1 False
但assert_frame_equal
处理NaN
等于自己:
>>> tm.assert_frame_equal(df, df)
# no AssertionError raised
答案 1 :(得分:3)
在python2.7上测试,我得到以下
import numpy as np
import pandas as pd
x = np.nan
x is np.nan #True
x is pd.NaT #False
np.isnan(x) #True
pd.isnull(x) #True
y = pd.NaT
y is np.nan #False
y is pd.NaT #True
np.isnan(y) #TypeError !!
pd.isnull(y) #True
您也可以使用
x != x #True for nan
y != y #True for NaT
但我不喜欢这种风格,我永远无法说服自己相信它。
答案 2 :(得分:2)
在执行assert_frame_equal检查之前,您可以使用数据框上的.fillna() method将空值替换为其他不会出现在您的值中的值。您可能还想阅读有关如何使用.fillna()方法的these examples。