检查 pandas 系列中的整数
checking for an integer in a pandas series
我 运行 在 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
我只是 missing/forgetting,这显然是一件非常简单的事情。我很想知道为什么 source_series_2 未通过 'in' 测试?
嗯,我认为这里的问题是函数的内部工作。
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
希望对您有所帮助!
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
我 运行 在 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
我只是 missing/forgetting,这显然是一件非常简单的事情。我很想知道为什么 source_series_2 未通过 'in' 测试?
嗯,我认为这里的问题是函数的内部工作。
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
希望对您有所帮助!
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