一列中的熊猫查询值基于另一列的值列表

时间:2020-09-30 09:59:20

标签: python pandas

我有一个带有id和value和value列的数据框。

df=
id    val
'a'    1
'b'    3
'c'    9 

....

我有一个(重复的)id值列表。

i_list=['a','a','a','b']

我需要使用数据帧对(id,val)将此(重复的)id值列表映射到相应的(重复的)值列中

out_desired=[1,1,1,3]

现在我正在做

out_desired=[df[df.id==curr_id].val.values for curr_id in i_list ]

如何以一种更高效,更简洁的方式做到这一点?

2 个答案:

答案 0 :(得分:2)

如果按字典顺序对id进行排序,则可以使用Series.searchsorted

df.loc[df['id'].searchsorted(i_list), 'val'].to_numpy().tolist()
[1, 1, 1, 3]

或者您可以将id设置为索引(也适用于未排序的id):

df.set_index('id').loc[i_list, 'val'].to_numpy().tolist()
# [1, 1, 1, 3]

如果没有对id列进行排序,请对第一种工作方法进行排序,然后按照上述步骤进行操作:

print(df)
  id  val
0  c    1
1  b    3
2  a    9

df_ = df.sort_values(['id'])
df_.loc[df_['id'].searchsorted(i_list), 'val'].to_numpy().tolist()
[1, 1, 1, 3]

答案 1 :(得分:1)

您可以尝试使用pandas.merge,因为它对我来说似乎更快。

df = {'id': ['a', 'b', 'c'], 'value': [1,3,9]}
df = pd.DataFrame(df).set_index('id')
test = ['a', 'b', 'c']*8
%timeit df.merge(pd.DataFrame({'id':test}), left_index=True, right_on='id', how='right')['value'].values
1.32 ms ± 33.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit [df[df.index==curr_id].values for curr_id in test ]
5.81 ms ± 123 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

我相信它会给出正确的答案