检查 pandas.Series.index 是不是包含值

Posted

技术标签:

【中文标题】检查 pandas.Series.index 是不是包含值【英文标题】:Checking that a pandas.Series.index contains a value检查 pandas.Series.index 是否包含值 【发布时间】:2019-01-04 21:38:36 【问题描述】:

我(我想我)知道如何检查一个值是否包含在熊猫系列的索引中,但我无法在下面的示例中让它工作。这可能是一个错误吗?

首先,我生成一些随机数:

import numpy as np
import pandas as pd

some_numbers = np.random.randint(0,4,size=10)
print(some_numbers)

输出:

[0 2 2 3 1 1 2 2 3 2]

然后,我用这些数字创建一个系列并计算它们的频率

s = pd.Series(some_numbers)
gb = s.groupby(s).size() / len(s)
print(gb)

输出:

0    0.1
1    0.2
2    0.5
3    0.2
dtype: float64

到目前为止,一切都很好。但是我不明白下一行代码的输出:

1.3 in gb

输出:

True

输出不应该是 False 吗? (我在 Python 3.6.2 上有 pandas 0.20.3)

我知道我可以使用

1.3 in list(gb.index)

但如果系列很大,这不是很有效。

显示错误的更简单示例

import pandas as pd
s = pd.Series([.1,.2,.3])
print(s)

0    0.1
1    0.2
2    0.3
dtype: float64
3.4 in s

False

但是,等等……

s = pd.Series([.1,.2,.3,.4])
print(s)

0    0.1
1    0.2
2    0.3
3    0.4
dtype: float64
3.4 in s

True

【问题讨论】:

我可以在 pandas 0.20.1 中重现。 @pault 我刚刚升级到 pandas 0.23.3,但我仍然得到 True @pault 抱歉,我复制粘贴了错误的输出。我编辑了帖子 @user3537808 我无法重现,因为我的索引是对象类型...因为我懒惰地做了some_numbers = "0 0 3 2 3 1 0 1 2 3".split()。我相信@sacul 的答案就是为什么。 【参考方案1】:

我认为问题在于gb.indexint64 索引:

>>> gb.index
Int64Index([0, 1, 2, 3], dtype='int64')

>>> type(gb.index)
<class 'pandas.core.indexes.numeric.Int64Index'>

因此,在与1.3 进行比较时,该值将被转换为 int。这方面的一些证据是高达3.99999 的值将返回True,因为将其转换为int 会得到3,但是,4.000001 in gb.index 会返回False,因为将4.000001 转换为int 会返回4(不在gb.index中)

如果你强制它为浮点索引,你最终会得到错误,因为1.3 不在Float64Index([0.0, 1.0, 2.0, 3.0], dtype='float64') 中:

>>> 1.3 in gb.index.astype('float')
False

测试于 pandas '0.21.1', python 3.6.3

【讨论】:

【参考方案2】:

使用values 属性。我认为你发现了一个错误。这应该是在github上提交的。

1.3 in gb.index.values

【讨论】:

@user3537808 当我尝试这个解决方案时,它对我有用。 (熊猫 0.20.1)

以上是关于检查 pandas.Series.index 是不是包含值的主要内容,如果未能解决你的问题,请参考以下文章

如何检查MySQL中是不是存在一行? (即检查电子邮件是不是存在于 MySQL 中)

如何检查MySQL中是不是存在行? (即检查电子邮件是不是存在于 MySQL 中)

如何检查对象是不是不是数组?

Google Apps 脚本 - 检查表是不是存在,如果存在则将其删除,检查删除作业是不是完成

除了代码之外,是不是可以检查位置是不是已启用?

我可以检查一个字符串是不是以 null 结尾,但不能检查它是不是还没有以 null 结尾