merge:数据世界的"外科缝合术"
我的掌握程度:
先掌握这个答案
四方式:left(保留左表全部,右表缺配填NaN——行情为主表时的默认);inner(只留两表都有的——"交集",静默丢行的元凶);outer(并集);right(少用)。行数对账:缝合后必须检查len(result)与预期——左表行数不变(left join一键值唯一时);行数暴涨=右表键重复(财务一天多公告);行数莫名变少=误用inner。merge vs concat:merge=按「键」横向拼列(SQL式join);concat=按「轴」纵向摞行或横向并排(拼多个月的数据文件用concat,贴新列用merge)。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
本阶段实战方法 · 一条能复现的数据流水线
把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。
- 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
- 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
- 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。
使用边界
- 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
- API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
打开术语词典,随时查阅基础概念。
背景 · 从一个困惑说起
行情表(每日每股)与财务表(每季公告)要拼在一起、股票表要贴上行业表、因子表要接上收益表——量化数据的一生都在"缝合"。merge是手术刀,用对是缝合、用错是灾难(行数爆炸或静默丢行)。
由此产生的问题
merge的四种连接方式(left/inner/outer/right)怎么选?「行数对账」为什么是缝合后的必做动作?merge与concat的分界?
核心概念
四方式:left(保留左表全部,右表缺配填NaN——行情为主表时的默认);inner(只留两表都有的——"交集",静默丢行的元凶);outer(并集);right(少用)。行数对账:缝合后必须检查len(result)与预期——左表行数不变(left join一键值唯一时);行数暴涨=右表键重复(财务一天多公告);行数莫名变少=误用inner。merge vs concat:merge=按「键」横向拼列(SQL式join);concat=按「轴」纵向摞行或横向并排(拼多个月的数据文件用concat,贴新列用merge)。
为什么需要它
①数据事故的第一现场:80%的"数据不对"发生在merge——重复键的扇出、inner的静默丢弃、键类型不一致(int的code遇str的code全NaN);②对账习惯的成本收益:一行print(len)能省两天的隐蔽bug排查;③研究口径的正确性:财务对齐用left(保留行情日),指数成分用left+fillna(False)——连接方式本身就是研究逻辑。
实际应用场景
标准缝合三步:merge前键去重(右表drop_duplicates(subset=keys))→merge(how='left', validate='m:1')→缝合后对账(len检查+NaN率检查)。validate参数('1:1'/'m:1')让pandas替你抓重复键——强烈建议常开。
与之前知识的联系
q-331/332的财务对齐是merge的高级形态(merge_asof);q-392(merge后行数变多)是本题的对账实战;面板结构(q-306)是缝合后的家。
⚠ 常见误解
- 默认inner很安全:inner是"静默丢行"专家——左表里没配上的行无声消失;研究主数据用left
- 行数对=缝合正确:行数对但NaN暴增=键类型错配(str vs int)——对账要查两个指标:行数+NaN率
- merge慢就换循环:慢通常是重复扫描——先排序再merge(sort+merge快数倍);循环只会更慢
🛠 本题实践任务
把你的两份数据(行情+任一特征)缝合:执行三步仪式(去重/merge(how='left',validate)/对账),把对账数字写进清洗日志。
💡 提示(先自己想5分钟再看)
validate='m:1'报错时读报错信息——它直接指出右表哪条键重复了,是最好的debug信息。
✅ 验收标准
一次带对账记录的缝合。从此你的每次merge都有手术记录。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(groupby、索引对齐),再用案例、公式和代码帮助理解。此功能需要先启用服务。