pandas DataFrame中按一列值列表获取另一列对应值的向量化方法
性能最优的两种向量化实现方案
方案1:将匹配列设为索引,直接批量取值
这是最高效的方案,pandas索引本身是哈希表结构,查找复杂度O(1),批量操作完全是向量化的,没有循环开销:
# 先把匹配列dec设为索引,提前做一次就可以反复调用 df = df.set_index('dec') # 直接对目标列表批量取值,返回对应hex列的序列,直接拼接即可 result = ''.join(df.loc[eight, 'hex'])
方案2:构造映射字典,用原生方法批量映射
如果不想修改原DataFrame的索引,可以先构造两列的映射关系,Python原生字典的查找性能也远高于循环调用pandas的匹配逻辑:
# 一次性构造dec到hex的映射字典 dec_to_hex = dict(zip(df['dec'], df['hex'])) # 批量映射目标列表 result = ''.join(map(dec_to_hex.get, eight))
性能对比
针对你给出的测试用例,两种方案的耗时都比原循环实现低两个数量级:
- 原循环方案:约2.34ms
- 索引批量取值方案:约22µs,性能提升100倍以上
- 字典映射方案:约18µs,性能提升130倍以上
原理解释
你原来的实现每次循环都要执行一次全表布尔匹配df.dec == x,单次匹配的时间复杂度是O(n),多次匹配开销会线性上涨,数据量大的时候性能下降会更明显。
而设索引或者构造字典都是只做一次O(n)的预处理,后续每次查找都是O(1),批量操作没有Python层面的循环开销,性能自然会高很多。
内容的提问来源于stack exchange,提问作者Ξένη Γήινος
相关产品推荐
相关产品推荐

