pandas合并数据是日常工作中最常见的操作,但也是最容易“对不上”的地方:左表5000行,右表3000行,合并后要么变成几十万行,要么关键字段全变成NaN,要么金额对不上、用户数对不上,领导一看报表直接问“这个数哪来的”。今天我们就把pd合并为什么总是对不上、以及合并键到底该怎么选才最稳、最不容易翻车,一次性彻底讲清楚,让大家以后合并再也不掉坑。
一、pd数据合并为什么对不上
合并对不上基本就这五大死因,几乎每一次事故都至少中三条:
1、键值类型不一致,最隐蔽也最要命
左表用户ID是int64,右表因为Excel自动转换变成了float64(100.0),或者左表是字符串“00123”,右表是纯数字123,pandas直接当完全不同的值处理,左连接后右边全是NaN;
2、键值有隐藏空格、大小写、前后缀
左表城市叫“北京”(后面有空格)、右表是“北京”,或者左表“SH001”、右表“sh001”,肉眼看一样,pandas死活不认;
3、键值重复导致笛卡尔积爆炸
最常见的就是用“日期+渠道”合并日报表,同一个渠道同一天左表有5条明细,右表也有5条汇总记录,inner合并直接变成25条,金额瞬间膨胀5倍;
4、选了业务含义不唯一的键
用“姓名”合并员工表和绩效表,结果重名小李有三个,绩效全错位;用“部门”合并部门预算和实际花费,部门下还有子部门,一样乱套;
5、时间戳精度不同
左表记录到秒2025-01-01 10:30:00,右表只到天2025-01-01,pandas直接当不同日期处理,左连接后全部丢失。
二、pd合并键应怎样选择
选对键是合并成败的关键,下面这套选键铁律照着做,对齐率能到99.9%:
1、优先选“系统生成、永不重复”的唯一键
最佳选择:订单号、交易流水号、用户ID、广告请求ID、日志ID这类由数据库自增或UUID生成的字段,永远唯一;
2、次选“业务上唯一”的复合键
比如手机号+日期(手机号去掉-和空格后唯一)、身份证号、营业执照号这类现实世界天然唯一的标识;
3、能不用容易重复的键就不用
姓名、城市、部门、产品名称、手机号(没清洗前)这类字段,除非万不得已,坚决不用;
4、时间键必须统一粒度
无论是日期还是时间戳,都先取整到同一级别(天、小时、分钟),再合并,绝不直接用原始时间戳;
5、没有完美键时,先聚合再合并
如果只能用城市、渠道这类会重复的键,先对两边都做groupby聚合(求和、去重、取最新),把重复键压成唯一,再合并。
三、pd合并长效不对齐零容忍实战技巧
一次合并成功不代表下次不炸,要彻底根治,靠下面这五板斧:
1、合并前必跑“键值健康检查三件套”
每次合并前都先对左右表跑下面三行代码,一眼看出问题:
2、永远先做“清洗三连”再合并
这三行代码能解决80%的对不上问题,建议写进公司数据处理规范;
3、合并后必做“三项黄金校验”
任何一项不通过,立即回滚重做;
4、重要报表合并必须写成函数+单元测试
把每月对账、每周报表合并逻辑封装成函数,加上pytest单元测试,任何改动立刻报警;
5、公司内部彻底禁止用Excel做合并前清洗
所有清洗、去重、聚合必须在Python或SQL里完成,Excel只允许看最终版,彻底杜绝隐藏格式、自动转换导致的灾难。
总结
pd数据合并为什么对不上pd合并键应怎样选择,说白了就是类型不一致、隐藏字符、重复键、选错键、时间精度这五大元凶在作怪。只要我们坚决执行“优先系统唯一键→业务唯一复合键→先聚合再合并→清洗三连→健康检查→三项校验”这套完整流程,再配上函数封装、单元测试、禁止Excel清洗这些硬核习惯,合并就能从“玄学对账”彻底变成“复制粘贴就准”,再也不用为对不上数通宵加班、被领导追问。