熊猫单元测试:如何断言NaT和NaN值的平等?

时间:2015-09-11 12:57:42

标签: python unit-testing pandas numpy nan

在NumPy和Pandas中,nan != nanNaT != NaT。因此,在单元测试期间比较结果时,如何断言返回值是其中一个值?即使我使用assertEqual,简单的pandas.util.testing也会自然失败。

3 个答案:

答案 0 :(得分:5)

如果您要比较标量,一种方法是将assertTrueisnull一起使用。例如,在DataFrame单元测试(pandas/tests/test_frame.py)中,您可以找到tests such as this

self.assertTrue(com.isnull(df.ix['c', 'timestamp']))

compandas/core/common.py的别名,因此com.isnull调用与pd.isnull相同的基础函数。)

另一方面,如果您将系列或数据框架与空值进行比较以获得相等性,则tm.assert_series_equaltm.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