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浏览器插件安装失败【解决方法】


