有没有比嵌套循环更高效的方案实现Pandas DataFrame匹配填充价格?
高效实现方案
推荐优先使用pandas矢量化操作替代循环,性能提升可达百倍至千倍量级,以下是两种可行方案:
方案1:使用map映射(最高效,适合单字段匹配赋值)
直接将DF2转为Security_ID为键、Price为值的字典,直接对DF1的目标列赋值即可:
# 构造映射字典 price_map = DF2.set_index('Security_ID')['Price'].to_dict() # 直接映射赋值 DF1['Current Date Price'] = DF1['Security Number Key'].map(price_map)
该方案完全避免了循环,是单字段匹配赋值的最优解,匹配不到的证券(比如示例中的C)会自动保留NaN值,完全符合需求。
方案2:使用merge关联(适合多字段需要同步匹配的场景)
如果后续需要从DF2同步更多字段,可以用左连接实现:
DF1 = DF1.merge( DF2, left_on='Security Number Key', right_on='Security_ID', how='left' # 重命名价格列并删掉冗余的Security_ID列 ).rename(columns={'Price': 'Current Date Price'}).drop('Security_ID', axis=1)
df.query返回结果不符合预期的原因及修复方法
之前用query返回的是带索引的Series对象,如果一定要用query实现,可以在末尾调用.squeeze()提取标量值:
for k, v in DF1['Security Number Key'].items(): if v in DF2['Security_ID'].values: # 提取单个价格值 price = DF2.query('Security_ID == @v')['Price'].squeeze() DF1.loc[k, 'Current Date Price'] = price
但该方案仍然存在循环,性能远不如前面的矢量化方案,仅作为问题原因说明参考。
内容的提问来源于stack exchange,提问作者Bigcat69
相关产品推荐
相关产品推荐

