从查找表返回索引,允许为空且找不到

时间:2019-02-05 11:43:58

标签: python pandas numpy

我正在尝试在查找表中查找允许找不到元素和不存在元素的索引(空)。

例如,在下面的测试数据中,变量“ A”将映射到查找表中的“ A”并返回索引0(查找表中“ A”的位置)

我一直在寻找使用searchsorted函数,但是没有解释返回0还是N。

“如果没有合适的索引,则返回0或N(其中N是a的长度)。”

从下面开始,我想返回的数据是: [0,1,2,3,2]

0-匹配A, 1-匹配B, 2-找不到,否则, 3-没有值,因此为NULL, 2-否则找不到。

遵守规则:

如果匹配返回匹配索引, 如果NaN返回NULL, 如果找不到,则返回其他。

testData = np.array(['A','B','B ',NAN,'Other'])
testLookup =np.array(['A','B','ELSE','NULL'])

>>> np.searchsorted(testLookup,testData)
array([0, 1, 2, 0, 4], dtype=int32)

1 个答案:

答案 0 :(得分:1)

NumPy不是为混合类型数组设计的。但是,如果您打算使用NumPy,则可以使用np.searchsorted通过在之前进行布尔索引来适当地转换值。

请记住要指定dtype=object,以避免将您的np.nan值自动转换为字符串。

testData = np.array(['A','B','B ',np.nan,'Other'], dtype=object)
testLookup = np.array(['A','B','ELSE','NULL'])

arr = testData.copy()
nulls = np.array([x != x for x in arr])
arr[nulls] = 'NULL'
arr[~np.in1d(arr, testLookup[:2]) & ~nulls] = 'ELSE'  # or use np.isin

res = np.searchsorted(testLookup, arr)

# array([0, 1, 2, 3, 2], dtype=int64)