![](/img/trans.png)
[英]Using .isin function to produce boolean results of whether a value is listed anywhere in different column
[英]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.