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

时间:2018-07-27 18:15:07

标签: python pandas indexing series

我(我想)知道如何检查pandas系列的索引中是否包含一个值,但是在下面的示例中我无法使其正常工作。也许是错误吗?

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

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

2 个答案:

答案 0 :(得分:10)

我认为问题在于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返回{{1 }},因为将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'

答案 1 :(得分:0)

使用Notes属性。我确实认为您发现了一个错误。这可能应该在github上提交。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Table1.Edit;
  TMemoField(Table1.FieldByName('Notes')).LoadFromFile('D:\test.rtf');
end;