Python 根据另一列的值列表查找一列中的值
我有一个数据框,包含和id和value列Python 根据另一列的值列表查找一列中的值,python,pandas,Python,Pandas,我有一个数据框,包含和id和value列 df= id val 'a' 1 'b' 3 'c' 9 我有一个重复id值的列表 i_list=['a','a','a','b'] 我需要使用dataframe pairs id val将这个重复id值列表映射到相应的重复值列中 out_desired=[1,1,1,3] 现在我正在做: out_desired=[df[df.id==curr_id].val.values for curr_id in i_list ]
df=
id val
'a' 1
'b' 3
'c' 9
我有一个重复id值的列表
i_list=['a','a','a','b']
我需要使用dataframe pairs id val将这个重复id值列表映射到相应的重复值列中
out_desired=[1,1,1,3]
现在我正在做:
out_desired=[df[df.id==curr_id].val.values for curr_id in i_list ]
如何以更高效且更简洁的方式执行此操作?如果ID按字典顺序排序,则可以使用:
或者,您也可以将id设置为对未排序id有效的索引:
如果未对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]
如果ID按字典顺序排序,则可以使用:
或者,您也可以将id设置为对未排序id有效的索引:
如果未对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]
你可以试着用它,因为它对我来说似乎更快
df={'id':['a','b','c'],'value':[1,3,9]}
df=pd.DataFramedf.set_索引'id'
测试=['a','b','c']*8
我相信它给出了正确的答案您可以尝试使用,因为它对我来说似乎更快
df={'id':['a','b','c'],'value':[1,3,9]}
df=pd.DataFramedf.set_索引'id'
测试=['a','b','c']*8
我相信它给出了正确的答案更新了@00_uuu00_u00第二种方法可能更快@00_u00_u00设置为indexI将保留问题几天,因为其他答案也可能有用。您是否检查了第二种方法是否工作得更快?我认为它更简单,应该更快@00_uu00_u00更新@00_u00_u00第二种方法可能更快@00_u00_u00设置为indexI将问题保留几天,因为其他答案也可能有用。您检查了第二种方法是否工作得更快吗?我认为它更简单,而且应该更快@00_uuuu00_uuu00
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]
%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)