Python 高效地查找数组中数据帧值的索引

Python 高效地查找数组中数据帧值的索引,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我有一个数据帧,类似于: x y z -------------- 0 A 10 0 D 13 1 X 20 ... 对于x和y的每个可能值,我有两个排序数组: x_values = [0, 1, ...] y_values = ['a', ..., 'A', ..., 'D', ..., 'X', ...] 所以我写了一个函数: def lookup(record, lookup_list, lookup_attr):

我有一个
数据帧
,类似于:

x     y     z
--------------
0     A     10
0     D     13
1     X     20
...
对于
x
y
的每个可能值,我有两个排序数组:

x_values = [0, 1, ...]
y_values = ['a', ..., 'A', ..., 'D', ..., 'X', ...]
所以我写了一个函数:

def lookup(record, lookup_list, lookup_attr):
    return np.searchsorted(lookup_list, getattr(record, lookup_attr))
然后打电话:

df_x_indicies = df.apply(lambda r: lookup(r, x_values, 'x')
df_y_indicies = df.apply(lambda r: lookup(r, y_values, 'y')

# df_x_indicies: [0, 0, 1, ...]
# df_y_indicies: [26, ...]
但是否有更有效的方法来实现这一点?并且可能同时有多个列来获取返回的
数据帧
,而不是一个序列

我试过:

np.where(np.in1d(x_values, df.x))[0]

但这会删除重复的值,这是不需要的。

使用
系列
.loc
进行更新,您也可以尝试使用
reindex

pd.Series(range(len(x_values)),index=x_values).loc[df.x].tolist()
Out[33]: [0, 0, 1]

使用
系列
.loc
更新,您也可以尝试使用
reindex

pd.Series(range(len(x_values)),index=x_values).loc[df.x].tolist()
Out[33]: [0, 0, 1]

您可以将索引数组转换为
pd.index
对象,以实现快速查找(er)

在哪里,

x_values
# [0, 1]

y_values
# ['a', 'A', 'D', 'X']

至于您对多个列执行此操作的要求,您将不得不对每个列进行迭代。这是上面代码的一个版本,应该推广到N列和索引

val_list = [x_values, y_values] # [x_values, y_values, z_values, ...]
idx_list = map(pd.Index, val_list)
pd.DataFrame({
    f'{c}': idx.get_indexer(df[c]) for idx, c in zip(idx_list, df)})

   x  y
0  0  1
1  0  2
2  1  3

您可以将索引数组转换为
pd.index
对象,以实现快速查找(er)

在哪里,

x_values
# [0, 1]

y_values
# ['a', 'A', 'D', 'X']

至于您对多个列执行此操作的要求,您将不得不对每个列进行迭代。这是上面代码的一个版本,应该推广到N列和索引

val_list = [x_values, y_values] # [x_values, y_values, z_values, ...]
idx_list = map(pd.Index, val_list)
pd.DataFrame({
    f'{c}': idx.get_indexer(df[c]) for idx, c in zip(idx_list, df)})

   x  y
0  0  1
1  0  2
2  1  3

我想我可能还不清楚我要检索哪些索引。我希望列
x
y
的索引基于其值出现在
x_值中的位置,以及
y_值中的位置,因此我希望
x
的返回标记(基于这个小示例)为
[0,0,1,…]
我想我可能不清楚要检索哪些索引。我希望列
x
y
的索引基于它们的值出现在
x\u值中的位置,以及
y\u值中的位置,因此我希望
x
的返回标记(基于这个小示例)是
[0,0,1,…]
,这很聪明!这也是我在之前的S.O.帖子中没有看到的read@SumNeuron如果有帮助,请考虑接受答案。谢谢。我会的,但过去有人建议我不要立即接受答案,而是给社区中的其他人一些时间来提出其他想法:)这很聪明!这也是我在之前的S.O.帖子中没有看到的read@SumNeuron如果有帮助,请考虑接受答案。谢谢。我会的,但过去有人建议我不要立即接受答案,而是给社区中的其他人一些时间来提出其他想法:)