【问题标题】:Comparing pandas Series for equality when they contain nan?当熊猫系列包含nan时比较它们是否相等?
【发布时间】:2013-08-29 11:49:22
【问题描述】:

我的应用程序需要比较有时包含 nan 的 Series 实例。这会导致使用== 进行普通比较失败,因为nan != nan

import numpy as np
from pandas import Series
s1 = Series([1,np.nan])
s2 = Series([1,np.nan])

>>> (Series([1, nan]) == Series([1, nan])).all()
False

比较此类系列的正确方法是什么?

【问题讨论】:

  • 您会考虑更改您接受的答案吗? ^^

标签: python pandas numpy nan equality-operator


【解决方案1】:

这个怎么样。首先检查 NaN 是否在同一个地方(使用isnull):

In [11]: s1.isnull()
Out[11]: 
0    False
1     True
dtype: bool

In [12]: s1.isnull() == s2.isnull()
Out[12]: 
0    True
1    True
dtype: bool

然后检查不是 NaN 的值是否相等(使用notnull):

In [13]: s1[s1.notnull()]
Out[13]: 
0    1
dtype: float64

In [14]: s1[s1.notnull()] == s2[s2.notnull()]
Out[14]: 
0    True
dtype: bool

为了平等,我们需要两者都为真:

In [15]: (s1.isnull() == s2.isnull()).all() and (s1[s1.notnull()] == s2[s2.notnull()]).all()
Out[15]: True

如果这还不够,您还可以检查名称等。

如果你想提出如果它们不同,请使用assert_series_equal from pandas.util.testing

In [21]: from pandas.util.testing import assert_series_equal

In [22]: assert_series_equal(s1, s2)

【讨论】:

  • 这行得通,太糟糕了,它引发了异常,而不仅仅是返回 False。
  • 谢谢,这很好用。我认为 Pandas 添加一个将这个小 sn-p 抽象到 Series 的方法可能是有意义的。
  • 我只是在想同样的事情,我确定你不必这样做。
  • @Sam 对 Series.equals() 的回答应该是公认的答案,并且自 0.13.1 (Feb 2014) 以来一直是正确的
  • 如果您想要元素比较,而不是单个布尔结果,这个答案仍然是正确的。
【解决方案2】:

目前应该只使用series1.equals(series2) 参见docs。这也检查nans 是否在相同的位置。

【讨论】:

    【解决方案3】:
    In [16]: s1 = Series([1,np.nan])
    
    In [17]: s2 = Series([1,np.nan])
    
    In [18]: (s1.dropna()==s2.dropna()).all()
    Out[18]: True
    

    【讨论】:

    • 杰夫,您的解决方案忽略了 NaN 的位置:(Series([1, nan]).dropna() == Series([nan, 1]).dropna()).all() #=> True
    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 2012-08-25
    • 2021-07-12
    • 1970-01-01
    • 2012-02-16
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多