如何用numpy/pandas从参考表中批量匹配十万级(a,b)对的对应m,n值
解决方案
方案1:pandas实现(推荐,可读性和性能兼顾)
pandas的merge操作底层做了大量性能优化,10万级查询毫秒级即可完成,代码在3行以内:
import pandas as pd table_df = pd.DataFrame(table, columns=['a', 'b', 'm', 'n']) query_df = pd.DataFrame(my_list, columns=['a', 'b']) results = query_df.merge(table_df, on=['a', 'b'], how='left')[['m', 'n']].values
也可以压缩为单行实现:
results = pd.DataFrame(my_list, columns=['a','b']).merge(pd.DataFrame(table, columns=['a','b','m','n']), on=['a','b'], how='left')[['m','n']].values
方案2:纯numpy实现
如果不想引入pandas依赖,可以用numpy的广播机制实现,性能同样远高于原生for循环:
import numpy as np match_mask = (table[:, np.newaxis, :2] == my_list).all(axis=2) results = table[match_mask.argmax(axis=0), 2:]
补充说明
如果存在my_list里的(a,b)对不在参考表中的情况,pandas方案会返回NaN,numpy方案默认返回第一行的结果,可根据业务需求额外添加缺失值校验逻辑;两种方案都自动支持my_list中的重复(a,b)对,和需求给出的for循环逻辑完全等效。
内容的提问来源于stack exchange,提问作者narutoArea51
相关产品推荐
相关产品推荐

