检查 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.index
是int64
索引:
>>> 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 中)