繁体   English   中英

dtype比较:==并且isin为“对象”产生不同的结果

[英]dtype comparison: == and isin produce different results for “object”

最小的例子:

df = pd.DataFrame({'x': ['a', 'b', 'c'], 'y': [1, 2, 3], 'z': ['d', 'e', 'f']})
df

   x  y  z
0  a  1  d
1  b  2  e
2  c  3  f

df.dtypes

x    object
y     int64
z    object
dtype: object

想法是过滤掉object类型的列。 我知道这可以使用select_dtypes完成,这个问题背后的动机是检查我将要向你展示的奇怪行为。

== (因此, .eq )用于比较特定类型。

df.dtypes == object

x     True
y    False
z     True
dtype: bool

但是, isin没有:

df.dtypes.isin([object])
df.dtypes.isin(['object'])

x    False
y    False
z    False
dtype: bool

OTOH,创建一个np.dtype对象并传递

df.dtypes.isin([np.dtype('O')])

x     True
y    False
z     True
dtype: bool

np.isin在这里工作,所以这没有理由表现出任何不同的行为。

np.isin(df.dtypes, object)
array([ True, False,  True])

np.isin(df.dtypes, 'object')
array([ True, False,  True])

isin似乎只在检查对象类型时造成麻烦。 df.dtypes.isin(['int'])给出了预期的结果。

作为旁注,我在0.24上运行这些测试。

pd.__version__
'0.24.2'

这是一个错误,还是预期的行为?

这归结为pandas.Series.isin 在这种情况下依赖于哈希表而在0.20.3中这可能已经下了不同的代码路径并使用np.in1d 具体取决于你的python / numpy版本

请注意, np.dtype('O')object的哈希值不同,这解释了当前的失败:

In [2]: hash(np.dtype('O'))
Out[2]: 7065344498483383396

In [3]: hash(object)
Out[3]: 108607961

看起来np.in1d正在对对象进行直接相等比较 ,并且与object / 'object'的相等性被内置到独立于哈希的np.dtype('O')的定义中。

这也说明了一个更大的问题isin大熊猫:这同样比较,但有不同的散列将失败对象isin为小输入性病例。 考虑以下课程:

class Foo(object):
    def __init__(self, hash_val):
        self.hash_val = hash_val

    def __hash__(self):
        return self.hash_val

    def __eq__(self, other):
        return isinstance(other, Foo)

然后我们得到:

In [5]: s = pd.Series([Foo(0), Foo(1), Foo(2)])

In [6]: s == Foo(3)
Out[6]:
0    True
1    True
2    True
dtype: bool

In [7]: s.isin([Foo(3)])
Out[7]:
0    False
1    False
2    False
dtype: bool

In [8]: np.in1d(s.values, [Foo(3)])
Out[8]: array([ True,  True,  True])

这是一个错误吗? 可能,但我猜它是一个低优先级的项目来修复,因为这是一个角落的情况,并且很可能以高效的方式修复(即当前实现有一个注释指示该对象dtypes不应该传递给np.in1d因为它可以引发,所以简单地委托给np.in1d将不起作用)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM