You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:18:17