> 经常听别人说 Python 在数据领域有多厉害,结果学了很长时间,连数据处理都麻烦得要死。后来才发现,原来不是 Python 数据处理厉害,而是他有数据分析神器—— pandas
前言
匹配查找是数据处理中经常出现的场景,如果懂点 Excel 的,基本都会 vlookup 这公式,今天我们来看看 pandas 中是怎么做到 vlookup 一样的效果,并且是懒人模式的匹配。
本文结构:
数据
这次不再展示 Excel 功能了,vlookup 谁不会呢。直接看实战。
数据长这个样子:
比 vlookup 还要智能?
pandas 中有多种数据配对实现方式,其中最像 Excel vlookup 公式的,就属 merge。
"根据名字找出其他信息":
看看,假如"待匹配"有 部门 与 收入,反过来找 名字 与性别:
潜在的问题
实际上,merge 是按照数据库的关系连接进行设计的,其中"笛卡尔积"是其中的核心逻辑。说白了就是当右表出现重复匹配时,会默认返回所有记录(毕竟不能丢失数据嘛)。
看看如下例子:
看起来效果还不错呢。但是,有时候我们会无意中跌入陷阱。
看看数据:
看看匹配执行结果:
> 这就是为什么写 Sql 关联多表时,我们都会很小心考虑表之间的颗粒度。
> tips:在专栏第9节有详细讲解关于数据颗粒度的理解与实战场景
既然 pandas 的 merge 方法是按照关系数据库表连接设计的,那么自然有数据库中的"关系验证"功能:
> 还有其他的验证关系,比如:'1:m','m:1','m:m'
身不由己
有时候需求就是要在重复数据中匹配某一条符合条件的记录。但是,pandas 中的 merge 是不会提供这样的功能。因为 pandas 中处理数据非常简单灵活,把数据源按要求处理规范是非常简单。下面看看例子。
"匹配时间最晚的人员信息":
> 跟着专栏学习的同学应该都能理解,这里不展开讲解
我们可以用 Python 的基本知识即可对这些逻辑进行封装。
"匹配收入最小的人员信息":
自定义
如果不希望每次都写 merge 的各种参数,我们也可以自定义一个 vlookup 方法,把 merge 调用细节隐藏起来。
用上一个例子的数据。
"根据名字匹配信息,重复时,使用平价收入作为返回":
总结