我有一个带有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 ]
如何以一种更高效,更简洁的方式做到这一点?
答案 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)
我相信它会给出正确的答案