Skip to main content
 首页 » 编程设计

python之有效地找到数组中 DataFrame 值的索引

2025年05月04日13dudu

我有一个类似于以下内容的 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): 
    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, ...] 

但是有没有更高效的方法来做到这一点?并可能一次获得多个列以获取返回的 DataFrame 而不是一系列?

我试过:

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

但这会删除重复值,这是不希望的。

请您参考如下方法:

您可以将索引数组转换为 pd.Index 对象以加快(呃)查找速度。

u, v = map(pd.Index, [x_values, y_values]) 
pd.DataFrame({'x': u.get_indexer(df.x), 'y': v.get_indexer(df.y)}) 
 
   x  y 
0  0  1 
1  0  2 
2  1  3 

在哪里,

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