Pandas06--连接

本文详细介绍了Pandas中的各种连接操作,包括基于键的关系型连接(如左连接、右连接、内连接和外连接),值连接的merge函数及其参数,以及索引连接的join函数。此外,还讨论了concat函数在纵向和横向拼接数据表中的应用,以及序列与表的合并方法如append和assign。最后,文章讲解了比较操作的compare函数和组合操作的combine函数的使用方法,提供多个示例帮助理解。
摘要由CSDN通过智能技术生成


1 关系型连接

1.1 连接的基本概念

  • 键:在关系型连接中, 是十分重要的,往往用on参数表示
  • 连接形式:在pandas中的关系型连接函数merge 和 join中提供了how 参数来代表连接形式,分为左连接 left 、右连接 right 、内连接 inner 、外连接 outer
    • 不同连接形式的区别:
      在这里插入图片描述
    • 分析:
      从图中可以看到,所谓左连接即以左边的键为准,如果右边表中的键于左边存在,那么就添加到左边,否则则处理为缺失值,右连接类似处理。内连接只负责合并两边同时出现的键,而外连接则会在内连接的基础上包含只在左边出现以及只在右边出现的值,因此外连接又叫全连接。## 1.2 值连接
  • 表中的键重复:同一个表中的键出现重复的情况,只把握一个原则,即只要两边同时出现的值,就以笛卡尔积的方式加入,如果单边出现则根据连接形式进行处理。
    • 【例子】设左表中键 张三 出现两次,右表中的 张三 也出现两次,那么逐个进行匹配,最后产生的表必然包含 2*2 个姓名为 张三 的行
      在这里插入图片描述
  • 总结:
    • 左连接和右连接:左连接和右连接是等价的,由于它们的结果中的键是被一侧的表确定的,因此常常用于有方向性地添加到目标表。
    • 内连接和外连接:内外连接两侧的表,经常是地位类似的,想取出键的交集或者并集

1.2 值连接

  • merge函数:通过几列值的组合进行连接,这种基于值的连接在pandas中可以由 merge 函数实现
  • 参数:
    • how 指定连接方式,
    • 两个表中想要连接的列不具备相同的列名,通过left_onright_on可以实现
    • 如果两个表中的列出现了重复的列名,那么可以通过 suffixes 参数指定
    • 出现重复元素,指定on 参数为多个列使得正确连接
    • validate参数来检查连接的唯一性模式,这里共有三种模式,即一对一连接·1:1 ,一对多连接 1:m ,多对一连接 m:1连接,第一个是指左右表的键都是唯一的,后面两个分别指左表键唯一和右表键唯一。
    • 【例子】上图左连接
    # 构造表
    df1 = pd.DataFrame({
         'Name':['San Zhang','Si Li'],
                        'Age':[20,30]})
    df2 = pd.DataFrame({
         'Name':['Si Li','Wu Wang'],
                        'Gender':['F','M']})   
    # 左连接                      
    df1.merge(df2, on='Name', how='left')
    '''
            Name  Age Gender
    0  San Zhang   20    NaN
    1      Si Li   30      F
    '''                                     
    
    • 【例子】两个表中想要连接的列不具备相同的列名
    # 构造表
    df1 = pd.DataFrame({
         'df1_name':['San Zhang','Si Li'],
                       'Age':[20,30]}) 
    df2 = pd.DataFrame({
         'df2_name':['Si Li','Wu Wang'],
                        'Gender':['F','M']}) 
    # 连接
    df1.merge(df2, left_on='df1_name', right_on='df2_name', how='left')
    '''
    df1_name  Age df2_name Gender
    0  San Zhang   20      NaN    NaN
    1      Si Li   30    Si Li      F
    '''
    
    • 【例子】合并考试成绩的时候,第一个表记录了语文成绩,第二个是数学成绩
    # 构造表
    df1 = pd.DataFrame({
         'Name':['San Zhang'],'Grade':[70]})
    df2 = pd.DataFrame({
         'Name':['San Zhang'],'Grade':[80]})
    # suffixes参数
    df1.merge(df2, on='Name', how='left', suffixes=['_Chinese','_Math'])
    ''' 
            Name  Grade_Chinese  Grade_Math
    0  San Zhang             70          80
    '''
    
    • 【例子】两位同学来自不同的班级,但是姓名相同
    In [14]: df1
    Out[14]: 
            Name  Age Class
    0  San Zhang   20   one
    1  San Zhang   21   two
    
    In [15]: df2
    Out[15]: 
            Name Gender Class
    0  San Zhang      F   two
    1  San Zhang      M   one
    
    df1.merge(df2, on='Name', how='left') # 错误的结果
    '''
            Name  Age Class_x Gender Class_y
    0  San Zhang   20     one      F     two
    1  San Zhang   20     one      M     one
    2  San Zhang   21     two      F     two
    3  San Zhang   21     two      M     one
    '''
    df1.merge(df2, on=['Name', 'Class'], how='left') # 正确的结果
    '''
    	        Name  Age Class Gender
    0  San Zhang   20   one      M
    1  San Zhang   21   two      F
    '''
    

1.3 索引连接

  • 索引连接:就是把索引当作键,和值连接本质上没有区别
  • join 函数:处理索引连接,
    • 参数:除了必须的 onhow之外,可以对重复的列指定左右后缀 lsuffixrsuffix 。其中,on 参数指索引名,单层索引时省略参数表示按照当前索引连接。
    • 【例子1】写出语文和数学分数合并的 join 版本
    df1 = pd.DataFrame({
         'Grade':[70]},
                        index=pd.Series(['San Zhang'],
                        name='Name'))
    
    df2 = pd.DataFrame({
         'Grade':[80]},
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值