Pandas实现两个表的连接功能的方法详解

目录
  • 准备数据
    • 先导入模块
    • 输出内容
  • 连接
    • 内连接
    • 外连接
    • 左连接
    • 右连接

上次介绍了pandas的多条件筛选,这些都是一些数据处理的必要技能,也不贪多,咱们每次学习一点。

这次咱们说说pandas的两个表的连接技能merge,也就是根据一个表的条件去匹配另一个表的内容。

话不多说,直接正文。

准备数据

先导入模块

import pandas as pd

df1 = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '刘六', '齐四'],
    '号码': ['123', '456', '789', '987', '654']
})

df2 = pd.DataFrame({
    '姓名': ['张三', '张三', '张三', '李四', '李四', '李四', '李四', '王五', '王五', '刘玉', '胡军', '刘玉', '刘六', '刘六', '刘六', '刘六', '刘克', '刘玉', '齐七', '齐七', '齐七', '齐七', '冯亮', '刘玉', '王云'],

    '号码': ['123', '123', '123', '123', '123', '456', '456', '456', '456', '456', '741', '741', '741', '741', '741', '789', '789', '789', '789', '789', '852', '852', '852', '852', '852'],

    '日期': ['2022-03-13', '2022-03-06', '2022-01-30', '2022-01-04', '2022-02-26', '2022-03-26', '2022-03-06', '2022-01-30', '2022-01-29', '2022-03-13', '2022-03-06', '2022-02-19', '2022-02-04', '2022-03-10', '2022-04-19', '2022-03-10', '2022-01-29', '2022-02-19', '2022-03-06', '2022-03-26', '2022-01-04', '2022-02-04', '2022-04-19', '2022-02-26', '2022-03-06'],

    '方案': ['G1012', 'G1022', 'G1002', 'G1007', 'G1017', 'G1023', 'G1018', 'G1003', 'G1008', 'G1013', 'G1020', 'G1015', 'G1010', 'G1005', 'G1025', 'G1004', 'G1009', 'G1014', 'G1019', 'G1024', 'G1006', 'G1011', 'G1026', 'G1016', 'G1021']
})

输出内容

df1内容

姓名   号码
0  张三  123
1  李四  456
2  王五  789
3  刘六  987
4  齐四  654

df2内容:

姓名  号码    日期      方案
0   张三  123  2022-03-13  G1012
1   张三  123  2022-03-06  G1022
2   张三  123  2022-01-30  G1002
3   李四  123  2022-01-04  G1007
4   李四  123  2022-02-26  G1017
5   李四  456  2022-03-26  G1023
6   李四  456  2022-03-06  G1018
7   王五  456  2022-01-30  G1003
8   王五  456  2022-01-29  G1008
9   刘玉  456  2022-03-13  G1013
10  胡军  741  2022-03-06  G1020
11  刘玉  741  2022-02-19  G1015
12  刘六  741  2022-02-04  G1010
13  刘六  741  2022-03-10  G1005
14  刘六  741  2022-04-19  G1025
15  刘六  789  2022-03-10  G1004
16  刘克  789  2022-01-29  G1009
17  刘玉  789  2022-02-19  G1014
18  齐七  789  2022-03-06  G1019
19  齐七  789  2022-03-26  G1024
20  齐七  852  2022-01-04  G1006
21  齐七  852  2022-02-04  G1011
22  冯亮  852  2022-04-19  G1026
23  刘玉  852  2022-02-26  G1016
24  王云  852  2022-03-06  G1021

连接

函数说明:pd.merge(left=df1(需要匹配的原始表), right=df2(被匹配的数据表), on="姓名"(需要匹配的条件列), how="inner"(连接方式))

内连接

how默认为inner:内连接查询特点是df1有匹配的才显示,不匹配的不显示

df = pd.merge(left=df1, right=df2, on="姓名", how="inner")

输出:

姓名 号码_x 号码_y  日期     方案
0   张三  123  123  2022-03-13  G1012
1   张三  123  123  2022-03-06  G1022
2   张三  123  123  2022-01-30  G1002
3   李四  456  123  2022-01-04  G1007
4   李四  456  123  2022-02-26  G1017
5   李四  456  456  2022-03-26  G1023
6   李四  456  456  2022-03-06  G1018
7   王五  789  456  2022-01-30  G1003
8   王五  789  456  2022-01-29  G1008
9   刘六  987  741  2022-02-04  G1010
10  刘六  987  741  2022-03-10  G1005
11  刘六  987  741  2022-04-19  G1025
12  刘六  987  789  2022-03-10  G1004

df1表里需要匹配的姓名里,在df2里面能匹配上姓名的都会列出来,而匹配不上的,都不会列出来,包括df1里面的内容

小提示:如果两表有相同列名的,会自动在列名后面加_x,_y来区分

外连接

how="outer"为外连接:查询特点是无论匹不匹配都显示,对应的值没有则显示空

df = pd.merge(left=df1, right=df2, on="姓名", how="outer")

输出:

姓名 号码_x 号码_y   日期     方案
0   张三  123  123  2022-03-13  G1012
1   张三  123  123  2022-03-06  G1022
2   张三  123  123  2022-01-30  G1002
3   李四  456  123  2022-01-04  G1007
4   李四  456  123  2022-02-26  G1017
5   李四  456  456  2022-03-26  G1023
6   李四  456  456  2022-03-06  G1018
7   王五  789  456  2022-01-30  G1003
8   王五  789  456  2022-01-29  G1008
9   刘六  987  741  2022-02-04  G1010
10  刘六  987  741  2022-03-10  G1005
11  刘六  987  741  2022-04-19  G1025
12  刘六  987  789  2022-03-10  G1004
13  齐四  654  NaN         NaN    NaN
14  刘玉  NaN  456  2022-03-13  G1013
15  刘玉  NaN  741  2022-02-19  G1015
16  刘玉  NaN  789  2022-02-19  G1014
17  刘玉  NaN  852  2022-02-26  G1016
18  胡军  NaN  741  2022-03-06  G1020
19  刘克  NaN  789  2022-01-29  G1009
20  齐七  NaN  789  2022-03-06  G1019
21  齐七  NaN  789  2022-03-26  G1024
22  齐七  NaN  852  2022-01-04  G1006
23  齐七  NaN  852  2022-02-04  G1011
24  冯亮  NaN  852  2022-04-19  G1026
25  王云  NaN  852  2022-03-06  G1021

df1表里索引13里的齐四无匹配,是空值,而在df2里面的内容都会列出来,和df1匹配不上的其它列的内容也是空值

注意:这有点互相匹配的意思哟

左连接

how="left"为左连接:查询表示左边的值全部显示,如右边无匹配则显示空。但是右边有的值匹配不了左边则不显示

df = pd.merge(left=df1, right=df2, on="姓名", how="outer")

输出:

姓名 号码_x 号码_y   日期     方案
0   张三  123  123  2022-03-13  G1012
1   张三  123  123  2022-03-06  G1022
2   张三  123  123  2022-01-30  G1002
3   李四  456  123  2022-01-04  G1007
4   李四  456  123  2022-02-26  G1017
5   李四  456  456  2022-03-26  G1023
6   李四  456  456  2022-03-06  G1018
7   王五  789  456  2022-01-30  G1003
8   王五  789  456  2022-01-29  G1008
9   刘六  987  741  2022-02-04  G1010
10  刘六  987  741  2022-03-10  G1005
11  刘六  987  741  2022-04-19  G1025
12  刘六  987  789  2022-03-10  G1004
13  齐四  654  NaN         NaN    NaN

df1表里索引13里的齐四还是无匹配,是空值,而在df2里面的内容就不会列出来了

右连接

how="right"为右连接:与左连接相反

df = pd.merge(left=df1, right=df2, on="姓名", how="right")

输出:

姓名 号码_x 号码_y          日期     方案
0   张三  123  123  2022-03-13  G1012
1   张三  123  123  2022-03-06  G1022
2   张三  123  123  2022-01-30  G1002
3   李四  456  123  2022-01-04  G1007
4   李四  456  123  2022-02-26  G1017
5   李四  456  456  2022-03-26  G1023
6   李四  456  456  2022-03-06  G1018
7   王五  789  456  2022-01-30  G1003
8   王五  789  456  2022-01-29  G1008
9   刘玉  NaN  456  2022-03-13  G1013
10  胡军  NaN  741  2022-03-06  G1020
11  刘玉  NaN  741  2022-02-19  G1015
12  刘六  987  741  2022-02-04  G1010
13  刘六  987  741  2022-03-10  G1005
14  刘六  987  741  2022-04-19  G1025
15  刘六  987  789  2022-03-10  G1004
16  刘克  NaN  789  2022-01-29  G1009
17  刘玉  NaN  789  2022-02-19  G1014
18  齐七  NaN  789  2022-03-06  G1019
19  齐七  NaN  789  2022-03-26  G1024
20  齐七  NaN  852  2022-01-04  G1006
21  齐七  NaN  852  2022-02-04  G1011
22  冯亮  NaN  852  2022-04-19  G1026
23  刘玉  NaN  852  2022-02-26  G1016
24  王云  NaN  852  2022-03-06  G1021

右连接正好与左连接相反,df1里面匹配不上的不显示,df2里面的内容全都出来了,匹配不上df1的其它列值则为空值

PS这完全是反向匹配呀

到此这篇关于Pandas实现两个表的连接功能的方法详解的文章就介绍到这了,更多相关Pandas表的连接内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • pandas表连接 索引上的合并方法

    如下所示: left1 = pd.DataFrame({'key':['a','b','a','a','b','c'],'value':range(6)}) right1 = pd.DataFrame({'group_val':[3.5,7]},index = ['a','b']) print(left1) print(right1) result = pd.merge(left1,right1,left_on='key',right_index=True) print(result) 层次化数

  • Python编程技巧连接列表的八种操作方法

    目录 1. 最直观的相加 2. 借助 itertools 3. 使用 * 解包 4. 使用 extend 5. 使用列表推导式 6. 使用 heapq 8. 使用 yield from Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的.在这些人的眼里,能够写出那些一般开发者看不懂的高级特性,就是高手,就是大神. 但你要知道,在团队合作里,炫技是大忌. 为什么这么说呢?我说下自己的看法: 越简洁的代码,越清晰的逻辑,就越不容易出错: 在团队合作中,你的代

  • Pandas实现两个表的连接功能的方法详解

    目录 准备数据 先导入模块 输出内容 连接 内连接 外连接 左连接 右连接 上次介绍了pandas的多条件筛选,这些都是一些数据处理的必要技能,也不贪多,咱们每次学习一点. 这次咱们说说pandas的两个表的连接技能merge,也就是根据一个表的条件去匹配另一个表的内容. 话不多说,直接正文. 准备数据 先导入模块 import pandas as pd df1 = pd.DataFrame({     '姓名': ['张三', '李四', '王五', '刘六', '齐四'],     '号码'

  • 对pandas中两种数据类型Series和DataFrame的区别详解

    1. Series相当于数组numpy.array类似 s1=pd.Series([1,2,4,6,7,2]) s2=pd.Series([4,3,1,57,8],index=['a','b','c','d','e']) print s2 obj1=s2.values # print obj1 obj2=s2.index # print obj2 # print s2[s2>4] # print s2['b'] 1.Series 它是有索引,如果我们未指定索引,则是以数字自动生成. 下面是一些例

  • jQuery ajax的功能实现方法详解

    jQuery的ajax方法非常好用,这么好的东西,你想拥有一个属于自己的ajax么?接下来,我们来自己做一个简单的ajax吧. 实现功能 由于jq中的ajax方法是用了内置的deferred模块,是Promise模式的一种实现,而我们这里没有讲过,所以我们就不使用这一模式啦. 我们只定义一个ajax方法,他可以简单的get,post,jsonp请求就可以啦~~ var ajax = function () { // 做一些初始化,定义一些私有函数等 return function () { //

  • Android中用Bmob实现短信验证码功能的方法详解

    这篇文章主要介绍发送验证码和校验验证码的功能,用到一个第三方平台Bmob,那Bmob是什么呢?Bmob可以开发一个云存储的移动应用软件,他提供了大量的标准的API接口,根据需要接入相关服务,开发者可以更加专注于应用的开发,让产品交付更快速,验证码功能就是其中一个. 一.跟其他第三方一样,我们开发之前要做一些准备工作. 1.首先,去官网注册一个帐号:http://www.bmob.cn/: 2.然后就可以创建应用了:具体怎么做Bmob说得很清楚了(官方操作介绍),如果你不想看,我简单说一下:点击右

  • 为Jquery EasyUI 组件加上清除功能的方法(详解)

    1.背景 在使用 EasyUI 各表单组件时,尤其是使用 ComboBox(下拉列表框).DateBox(日期输入框).DateTimeBox(日期时间输入框)这三个组件时,经常有这样的需求,下拉框或日期只允许选择.不允许手动输入,这时只要在组件选项中加入 editable:false 就可以实现,但有一个问题,就是:一旦选择了,没办法清空.经过研究,可以用一个变通的解决方案:给组件加上一个"清除"按钮,当有值是,显示按钮,点击按钮可清空值,当无值是,隐藏按钮. 2.函数定义 定义JS

  • 对pandas的层次索引与取值的新方法详解

    1.层次索引 1.1 定义 在某一个方向拥有多个(两个及两个以上)索引级别,就叫做层次索引. 通过层次化索引,pandas能够以较低维度形式处理高纬度的数据 通过层次化索引,可以按照层次统计数据 层次索引包括Series层次索引和DataFrame层次索引 1.2 Series的层次索引 import numpy as np import pandas as pd s1 = pd.Series(data=[99, 80, 76, 80, 99], index=[['2017', '2017',

  • Python实现邮件发送功能的方法详解

    目录 利用 python 发送普通邮件 认识发送邮件流程 认识邮件协议 smtplib 模块 email 包 发送邮件小案例 发送邮件的避坑总结 邮件自动化篇章所需的新模块: smtplib 邮件协议与发送模块 email 内容定义模块 schedule 定时模块 smtplib 与 email 模块 可以帮助我们正常的发送邮件: schedule 模块可以帮助我们定时发送邮件,比如工资邮件等需要固定时间发送的邮件 利用 python 发送普通邮件 认识发送邮件流程 这里简单描述下发邮件的过程(

  • Java实现统计在线人数功能的方法详解

    目录 1. 监听器的简介 2. Java监听器的类型 (1)ServletContextListener (2)HttpSessionListener (3)ServletRequestListener (4)ServletContextAttributeListener (5)HttpSessionAttributeListener (6)ServletRequestAttributeListener (7)HttpSessionActivationListener 3.监听器Listener

  • node.js连接mongoose数据库方法详解

    目录 创建项目命令 连接mongoose数据库 配置跨域 运行 创建项目命令 express --view ejs 项目名 进入项目,我们需要npm i 下载配置文件 有时候会出先端口已经被占用的情况,我们可以在bin目录下www文件中修改端口 连接mongoose数据库 我们创建一个新的文件夹,然后在文件夹下创建一个连接mongoose数据库的文件,代码如下 var mongoose=require('mongoose') mongoose.connect('mongodb://127.0.0

  • mysql表名忽略大小写配置方法详解

    linux下mysql默认是要区分表名大小写的.mysql是否区分大小写设置是由参数lower_case_table_names决定的,其中: 1)lower_case_table_names = 0  区分大小写(即对大小写不敏感),默认是这种设置.这样设置后,在mysql里创建的表名带不带大写字母都没有影响,都可以正常读出和被引用. 2)lower_case_table_names = 1  不区分大小写(即对大小写敏感).这样设置后,表名在硬盘上以小写保存,MySQL将所有表名转换为小写存

随机推荐