【问题标题】:Pandas unit testing: How to assert equality of NaT and NaN values?Pandas 单元测试:如何断言 NaT 和 NaN 值相等?
【发布时间】:2015-12-08 01:13:56
【问题描述】:

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

【问题讨论】:

  • 使用isnull
  • 简单地说value != value应该是真的

标签: python unit-testing pandas numpy nan


【解决方案1】:

在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】:

    如果您要比较标量,一种方法是将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 相同的底层函数。)

    另一方面,如果您将 Series 或 DataFrames 与 null 值进行比较是否相等,这些将由 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_equalNaN 处理为等于它自己:

    >>> tm.assert_frame_equal(df, df)
    # no AssertionError raised
    

    【讨论】:

      【解决方案3】:

      在进行 assert_frame_equal 检查之前,您可以在数据帧上使用 .fillna() method 将空值替换为不会出现在您的值中的其他值。您可能还想阅读these examples,了解如何使用 .fillna() 方法。

      【讨论】:

      • 谢谢,这几乎正是我一直在寻找的。我说“几乎”是因为你不能传递None,这将是一个理想的类型中性值,但是另一个唯一的标量,例如零或字符串(例如"INCORRECT!!!1!1!" ;-)),现在已经足够了。
      • @BerislavLopac:也许我完全误解了你想要做什么,但assert_frame_equal 已经断言NaN 等于NaN。使用 fillna()NaN 替换为其他一些要比较是否相等的标量是多余的,因此不在 Pandas 的单元测试中使用。
      • 呸,你说得对——我把你的建议听得太直白了,我打电话给fillna 之前 assert_frame_check,所以我错过了它解决了差异。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2014-06-25
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多