Pandas 数据合并实战:基于日期与股票代码的跨表价格匹配

发布时间 - 2026-01-31 00:00:00    点击率:

本文详解如何将宽格式股价数据(日期为索引、股票为列)与交易记录表(含 date 和 symbol 列)精准关联,通过 stack + merge 实现按日期+股票双重键查找并添加 price 字段。

在金融数据分析中,常需将宽格式的价格数据表(如每列为一只股票、索引为交易日)与长格式的交易事件表(如每行为一笔买卖,含 Date、Symbol、Shares 等字段)进行关联,从而为每笔交易补充对应时刻的成交价格。由于两表结构差异大——前者是 DatetimeIndex × StockColumns 的二维矩阵,后者是普通带列名的 DataFrame——直接使用 pd.concat() 或 join() 并不适用;正确做法是先重塑价格表结构,再执行多键合并

✅ 正确步骤:stack → reset_index → merge

假设你已加载两个 DataFrame:

  • df_prices:索引为 DatetimeIndex(如 '2007-01-10', '2007-01-17'),列名为股票代码('SPY', 'AAPL', 'IBM', ...);
  • df_trades:普通 DataFrame,含列 'Date'(字符串或 datetime)、'Symbol'、'Order'、'Shares'。

你需要为 df_trades 中每一行,从 df_prices 中查出 相同日期 + 相同股票 对应的价格,并新增 'Price' 列。

? 核心操作解析

# 1. 将宽表 df_prices 转为长表:每行 = (日期, 股票, 价格)
tmp = df_prices.stack().reset_index(name='Price')
# 结果列:level_0(原索引日期)、level_1(原列名股票)、Price

# 2. 与交易表按日期和股票列合并
result = df_trades.merge(
    tmp,
    left_on=['Date', 'Symbol'],
    right_on=['level_0', 'level_1'],
    how='inner'  # 仅保留有价格匹配的交易
).drop(columns=['level_0', 'level_1'])  # 清理冗余键列
? stack() 是关键:它将列名(股票代码)“压入”行内,生成一个具有 MultiIndex 的 Series;reset_index(name='Price') 则将其展开为标准三列 DataFrame,便于后续 merge。

? 完整可运行示例

import pandas as pd

# 构造示例价格数据(索引为日期)
df_prices = pd.DataFrame({
    'SPY': [126.72, 128.05],
    'AAPL': [96.59, 94.54],
    'IBM': [89.56, 90.58],
    'GOOG': [489.46, 497.28],
    'XOM': [62.47, 63.77],
    'BAC': [46.40, 46.17],
    'GLD': [60.59, 62.64]
}, index=pd.to_datetime(['2007-01-10', '2007-01-17']))

# 构造示例交易数据
df_trades = pd.DataFrame({
    'Date':

pd.to_datetime(['2007-01-10', '2007-01-17', '2007-01-19']), 'Symbol': ['AAPL', 'AAPL', 'IBM'], 'Order': ['BUY', 'SELL', 'BUY'], 'Shares': [2500, 1500, 400] }) # 执行合并 tmp = df_prices.stack().reset_index(name='Price') result = df_trades.merge( tmp, left_on=['Date', 'Symbol'], right_on=['level_0', 'level_1'], how='inner' ).drop(columns=['level_0', 'level_1']) print(result)

输出结果:

        Date Symbol Order  Shares  Price
0 2007-01-10   AAPL   BUY    2500  96.59
1 2007-01-17   AAPL  SELL    1500  94.54

⚠️ 注意:第三笔交易 '2007-01-19' 未出现在 df_prices 中(该表只含前两日),因此被 how='inner' 自动过滤。若需保留所有交易并填充 NaN(如 how='left'),请按需调整。

✅ 替代方案对比(不推荐)

  • ❌ pd.concat(..., axis=1):仅适用于索引完全对齐的横向拼接,无法按 Symbol 动态取值;
  • ❌ df_trades['Price'] = df_prices.lookup(...):lookup 已弃用,且要求索引/列严格匹配,容错性差;
  • ✅ map + apply:虽可行但效率低,尤其大数据量时明显慢于向量化 merge。

✅ 最佳实践建议

  • 始终确保 Date 列类型一致(推荐统一为 datetime64[ns]);
  • 若 df_prices 索引含时区信息,请在 merge 前用 .dt.tz_localize(None) 统一;
  • 合并后建议检查 result['Price'].isna().sum(),确认缺失值是否符合预期;
  • 对大规模数据,可先对 tmp 设置 set_index(['level_0','level_1']) 加速 merge。

掌握 stack + merge 这一组合技,你就能灵活应对各类“宽表→长表→业务主表”的关联需求,真正打通行情数据与交易逻辑之间的最后一公里。


# go  # 大数据  # app  # 金融  # pandas  # date  # 字符串  # map  # symbol  # 事件  # 数据分析  # 这一  # 按日  # 一只  # 就能  # 出现在  # 适用于  # 请在  # 它将  # 交易日  # 而为 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用JavaScript实现文本编辑器_光标和选区怎么处理  什么是javascript作用域_全局和局部作用域有什么区别?  高防服务器租用如何选择配置与防御等级?  Laravel如何实现API速率限制?(Rate Limiting教程)  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  手机软键盘弹出时影响布局的解决方法  如何在云主机上快速搭建多站点网站?  如何解决hover在ie6中的兼容性问题  Linux系统运维自动化项目教程_Ansible批量管理实战  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Java类加载基本过程详细介绍  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Linux安全能力提升路径_长期防护思维说明【指导】  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Python数据仓库与ETL构建实战_Airflow调度流程详解  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  微信小程序 闭包写法详细介绍  如何用好域名打造高点击率的自主建站?  如何快速上传自定义模板至建站之星?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel如何使用Gate和Policy进行授权?(权限控制)  Laravel如何处理表单验证?(Requests代码示例)  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  如何快速搭建虚拟主机网站?新手必看指南  教学论文网站制作软件有哪些,写论文用什么软件 ?  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  动图在线制作网站有哪些,滑动动图图集怎么做?  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  node.js报错:Cannot find module 'ejs'的解决办法  C++用Dijkstra(迪杰斯特拉)算法求最短路径  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  南京网站制作费用,南京远驱官方网站?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  想要更高端的建设网站,这些原则一定要坚持!  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  使用C语言编写圣诞表白程序  大连 网站制作,大连天途有线官网?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】