> 经常听别人说 Python 在数据领域有多厉害,结果学了很长时间,连数据处理都麻烦得要死。后来才发现,原来不是 Python 数据处理厉害,而是他有数据分析神器—— pandas
前言
Excel 中名声最响的就是 vlookup 函数,当然在 Excel 函数公式中用于查找的函数家族也挺大,不过在 pandas 中这功能却要简单多了。今天就来看看 pandas 中任何实现 Excel 中的多列批量 vlookup 的效果
案例1:简单匹配
一天,你收到一份数据源表如下:
- - 每个人每个城市的销售额数据
接着,你需要把下图的表格从数据源表匹配过来:
- - 根据名字与上方的城市名字,从表1中匹配数据
对于 Excel 来说,这需求很简单,一个 vlookup 即可解决:
- - 由于刚好目标表的城市顺序与源表顺序一样,因此可以这么解决
那么我们来看看 pandas 中怎么实现:
- - 行6、7,由于现在需要姓名匹配,我们把2份数据的姓名列设置为行索引
- - 行9,简单调用 update 方法,表示 df_tg 按照 df_src 更新值
由于 pandas 的数据表(DataFrame) 有行列索引,并且总是行列索引对齐,因此匹配数据是轻而易举的事情。
> 注意:本文所有的 pandas 更新方法,都是索引更新,而非遍历更新,因此速度非常快。别用 vlookup 的速度与其相比
案例2:有缺失
有时候,目标表不是这么"好说话":
- - 这次的城市列只有2列
那么,用 Excel 的 vlookup 就要配合 match 函数进行动态定位:
> 不多讲解 Excel 的做法了,因为随着需求难度逐渐提升,公式会越来越"丑"
同样看看 pandas 的做法:
你可能会觉得是我贴错了代码,这不就是案例1的代码吗?
你没看错,这代码只是读取的表名不一样而已。其他代码一样。很简单吧。
案例3:不存在的列
你可能会疑问:如果目标表本身就有一些数据源不存在的列,那么更新还能顺利吗:
- - 目标表多了一列数据,我们当然希望更新不会影响到这一列
继续看 pandas 的代码:
- - 是的,他很智能,只会更新列名配对的那些列
案例4:多列匹配
上面的案例只是根据名字来匹配,如果需要根据多个列匹配呢?
如下一份数据源:
- - 颗粒为,每人每个城市的指标值
目标表如下:
- - 根据 姓名 与 城市 ,匹配出指标
你可能会以为这次我总要用点啥技巧了吧。pandas 没有那么多花俏的东西,还是那段代码:
- - 行6和7,设置 姓名 与 城市 作为行索引即可,其他代码不变
这里的案例只是行索引为多层索引,实际上即使是列标题为多层复合,也能用同样的方式匹配。
> 多层索引及其应用,以及更多关于数据更新的高级应用,请关注我的 pandas 专栏
总结