在 Pandas 整数列中查找整数 id 编号时,我遇到了一个令人惊讶的结果,我知道该编号在列表中。我现在已经把它归结为一个让我感到困惑的非常简单的测试用例。我显然遗漏了一些非常明显的东西?!
这是我重现问题的方式:
import numpy as np
import pandas as pd
# Create two pandas objects; col_2 is an np.int64
source_series_1 = pd.DataFrame({'col_1': ['a','b','c','d'], 'col_2':np.int64([1, 2, 3, 4])})
source_series_2 = pd.DataFrame({'col_1': ['a','b','c','d'], 'col_2':np.int64([101, 102, 103, 104])})
现在测试这些 dfs 中的成员资格:
# Test membership in pandas series
print(np.int64(2) in source_series_1.col_2)
print(np.int64(102) in source_series_2.col_2)
输出:
True
False # ?!
# But! convert to a simple list...
print(np.int64(2) in list(source_series_1.col_2))
print(np.int64(102) in list(source_series_2.col_2))
输出:
True
True
我注意到在没有显式转换的情况下,我得到了相同的输出:
print(2 in source_series_1.col_2) #True
print(102 in source_series_2.col_2) #False
显然有一些非常简单的事情正在发生,我只是想念/忘记了。我很想了解为什么 source_series_2 未通过“in”测试?
答案 0 :(得分:0)
嗯,我认为这里的问题在于函数的内部工作。
print(np.int64(2) in source_series_1.col_2)
print(np.int64(102) in source_series_2.col_2)
在您的情况下,这会查看 DataFrame/Series 的索引(source_series_1.col_2 或 source_series_2.col_2)。
在哪里
print(np.int64(2) in list(source_series_1.col_2))
print(np.int64(102) in list(source_series_2.col_2))
在值中明确列出搜索,因为没有索引。
我是如何得出这个结论的,如果你搜索
print(np.int64(2) in source_series_1.col_2)
print(np.int64(2) in source_series_2.col_2)
你会得到
True
True
我希望这会有所帮助!
答案 1 :(得分:0)
pd.Series 不打算以这种方式与 'in' 运算符一起使用。 例如: 这有效,但没有意义,对吗?
np.int64(1) in source_series_2.col_2
>>>True
np.int64(2) in source_series_2.col_2
>>>True
但是,如果您查看需要执行的操作的实际实现,您可以使用它,因为它对元素进行了实际匹配。
getattr(source_series_2.col_2,'__eq__')(101)
输出:
0 True
1 False
2 False
3 False
Name: col_2, dtype: bool