Pandas如何按多列值匹配用另一DataFrame更新目标DataFrame
Pandas 双字段匹配填充收盘价方案
你需要的无循环向量化实现可以直接用pandas内置的合并/映射接口完成,底层为C实现的向量运算,性能远高于逐行遍历,适合大体量行情数据场景。
方案1:pd.merge 通用实现(最推荐)
这是适配性最高的写法,不需要提前修改索引,内存占用低,代码可读性强:
import pandas as pd # 第一步:统一两表日期格式,避免字符串/日期类型不匹配导致匹配失败 df1['Date'] = pd.to_datetime(df1['Date']) df2['Date'] = pd.to_datetime(df2['Date']) # 第二步:左连接匹配收盘价 result = pd.merge( left=df1, right=df2[['ticker', 'Date', 'Close']], # 只提取需要的列,减少不必要的内存开销 on=['ticker', 'Date'], # 指定两个字段作为联合匹配键 how='left' # 左连接保留df1全部原始行,不会丢失原数据 )
- 匹配逻辑完全等价于逐行判断效果,但运算效率比
iterrows/apply逐行写法高100~1000倍 - 若df2中找不到对应ticker+Date的记录,对应行的Close值会自动填充为
pd.NA,方便后续排查缺失行情 - 如果df2中存在同一ticker+Date对应多条记录的情况,需要先对df2去重,避免合并后df1行数膨胀:
# 按联合键去重,重复记录保留第一条 df2 = df2.drop_duplicates(subset=['ticker', 'Date'], keep='first')
方案2:索引映射实现(适合高频重复查询场景)
如果你需要多次用同一套df2行情数据匹配不同的df1表格,可以提前给df2构建联合索引,后续映射速度更快:
# 构建(ticker, Date)到Close的映射序列 close_lookup = df2.set_index(['ticker', 'Date'])['Close'] # 索引对齐直接取值 result = df1.set_index(['ticker', 'Date']).join(close_lookup).reset_index()
注意:匹配前请确认两表的ticker大小写、Date时区/精度完全一致,否则会出现非预期的匹配缺失。
内容的提问来源于stack exchange,提问作者sud
相关产品推荐
相关产品推荐

