Python Pandas Merge 使用简介 (类似 SQL Join 多个表)

Pandas Merge的应用参见下一篇:使用 PANDAS MERGE 一键合并多个表

在使用 SQL 的时候经常会感慨它的简单方便直接但是缺点是,想要使用 SQL 语言来操作数据就必须先把数据写进数据库中。这一原因使得平常生活中几乎不会有人使用 SQL 处理数据(都是工作中才用),毕竟谁会没事为自己的数据建表然后每天同步呢/捂脸.

这一次 Bob 的需求是将多个表拼起来进行对比。听上去是不是很熟悉? 对的,其实就是 SQL Join 功能。那就直接把表导入数据库然后用 SQL 拼一下吧? 不行不行不行。因为这次的需求并不是一个一次性需求,未来可能经常需要这个功能。同时这是一个时效性需求,如果不能快速进行对比就没有意义了。因此将表格导入数据库的念头就被扑灭了。那还有没有什么别的方法呢?

这个时候就要隆重介绍我们的 Python Pandas Merge 函数了,虽然写作 Merge 但是功能和 SQL 中的 Join 几乎一模一样,我们先来看看它的默认参数:

DataFrame.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
  • left: 左表
  • right: 右表
  • how=””: Join方式, 可选 left, right, outer, inner; 默认inner.
  • on=[]: 连接键; 默认是重复的列.
  • left_on=[]: 根据左表列名作连接键配对; 默认None.
  • right_on=[]: 根据右表列名作连接键配对; 默认None.
  • left_index: 使用左表索引作连接键; 默认关闭.
  • right_index: 使用右表索引作连接键; 默认关闭.
  • sort: 根据连接键的值排序; 默认关闭.
  • suffixes: 给重复列添加尾缀; 默认_x,_y.
  • copy: 开启时被引用的数据也会出现在结果中; 默认开启.
  • indicator: 开启时会生成一列_merge用以显示该列来源哪个表; 默认关闭.
  • validate: 验证连接键在两个表中的关系, 一对一1:1,一对多1:m,多对一m:1,多对多m:m; 默认关闭.

来看一个简单的例子:

import pandas as pd
  
tableLeft = pd.DataFrame([['20200101','微信','微信事件A','65'],
                          ['20200101','微信','微信事件B','43'],
                          ['20200102','微信','微信事件A','89'],
                          ['20200102','微信','微信事件B','76676'],
                          ['20200101','QQ浏览器','浏览器A','567'],
                          ['20200101','QQ浏览器','浏览器B','45']], 
                         columns=["时间","产品","类型","左表数量"])
  
tableRight = pd.DataFrame([['20200101','微信','微信事件A','2414'],
                           ['20200101','微信','微信事件B','425'],
                           ['20200101','微信','微信事件C','23'],
                           ['20200101','QQ浏览器','浏览器A','3233'],
                           ['20200101','QQ浏览器','浏览器B','57'],
                           ['20200101','QQ浏览器','浏览器C','0'],
                           ['20200102','QQ浏览器','浏览器A','3258'],
                           ['20200102','QQ浏览器','浏览器B','1236']], 
                          columns=["时间","产品","类型","右表数量"])

将左右表合并(使用outer join):

pd.merge(tableLeft, tableRight, how="outer", indicator=True, sort=True)

合并表

可以看到,合并之后的表根据左右两张表中都存在的列进行了配对,将两表独有的列分别配对。不存在的值使用了NaN进行填充。如果希望将缺失值替换为别的值可以使用DF.fillna(value="NULL")。由于设置了indicator=True,所以结尾会有一列_merge说明结果的出处表.

总的来说,Pandas Merge 功能就是这些。写到这里,Bob 不禁要感慨一下,Pandas 的功能是真的强大。未来 Bob 也会和大家继续介绍 Pandas 中不是特别常用,但却很有用的函数。敬请期待~