为什么Pandas Series.isin适用于字符串而不适用数字?

时间:2018-10-24 21:17:30

标签: python pandas

简单的例子:

>>> df = pd.DataFrame(
         columns=['x', 'y', 'z'],
         data=np.array([
             ['a', 1, 'foo'],
             ['b', 2, 'bar'],
             ['c', 3, 'biz'],
             ['d', 99, 'baz'] ]))
>>> df
   x   y    z
0  a   1  foo
1  b   2  bar
2  c   3  biz
3  d  99  baz

>>> df[df.z.isin(['foo', 'biz'])]
   x  y    z
0  a  1  foo
2  c  3  biz

那按预期工作!

但是,现在我尝试使用y

>>> df[df.y.isin([1,3])]
Empty DataFrame
Columns: [x, y, z]
Index: []

发生了什么事?

我希望与上述.z.isin(...)示例中的输出相同的两行。

2 个答案:

答案 0 :(得分:3)

让我们看看问题的根源。实际上是对np.array的调用。

np.array([['a', 1, 'foo'],
          ['b', 2, 'bar'],
          ['c', 3, 'biz'],
          ['d', 99, 'baz']])

这实际上将整数强制为字符串:

array([['a', '1', 'foo'],
       ['b', '2', 'bar'],
       ['c', '3', 'biz'],
       ['d', '99', 'baz']], dtype='<U3')

由于强制类型,请注意第二列是所有字符串。 OTOH,如果使用显式dtype=object初始化数组,则会保留单个类型:

data = np.array([['a', 1, 'foo'],
                 ['b', 2, 'bar'],
                 ['c', 3, 'biz'],
                 ['d', 99, 'baz']], dtype=object)

df = pd.DataFrame(columns=['x', 'y', 'z'], data=data)
df.y.isin([1,3])

0     True
1    False
2     True
3    False
Name: y, dtype: bool

或者,更好的是,传递异构列表列表(无需转换为数组)。

df = pd.DataFrame(data=[['a', 1, 'foo'],
                        ['b', 2, 'bar'],
                        ['c', 3, 'biz'],
                        ['d', 99, 'baz']], 
                  columns=list('xyz'))
df.y.isin([1,3])

0     True
1    False
2     True
3    False
Name: y, dtype: bool

答案 1 :(得分:1)

如果您查看df.y,它的类型为object,如果将其转换为int,则会得到您期望的行为

In [8]: df.y
Out[8]: 
0     1
1     2
2     3
3    99
Name: y, dtype: object