简单的例子:
>>> 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(...)
示例中的输出相同的两行。
答案 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