• pandas第六章 -连接


    一、关系型连接

    也分为左连接 left 、右连接 right 、内连接 inner 、外连接 outer

    1.值连接

    1)连接列的值相同:
    df1.merge(df2,on=‘相同的列名’,how = ‘左/右/内/外连接’)

    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')
    Out[5]: 
            Name  Age Gender
    0  San Zhang   20    NaN
    1      Si Li   30      F
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2)连接列的值不同:
    df1.merge(df2,left_on = ‘左表名’, right_on=‘右表名’, how=‘左/右/内/外连接’)
    左连接,右表没有对应的值便会现实为空

    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')
    Out[8]: 
        df1_name  Age df2_name Gender
    0  San Zhang   20      NaN    NaN
    1      Si Li   30    Si Li      F
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3)如果两个表中的列出现了重复的列名,那么可以通过 suffixes 参数指定。
    df1.merge(df2, on = ‘合并的列’, how = ’ 合并方式’, suffixes = [指定列名])

    #合并考试成绩的时候,第一个表记录了语文成绩,第二个是数学成绩:
    df1 = pd.DataFrame({'Name':['San Zhang'],'Grade':[70]})
    
    df2 = pd.DataFrame({'Name':['San Zhang'],'Grade':[80]})
    
    df1.merge(df2, on='Name', how='left', suffixes=['_Chinese','_Math'])
    Out[11]: 
            Name  Grade_Chinese  Grade_Math
    0  San Zhang             70          80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4)通过on指定多个列作为合并的根据列

    处理同名不同班的两个同学:

    df1 = pd.DataFrame({'Name':['San Zhang', 'San Zhang'],
                        'Age':[20, 21],
                        'Class':['one', 'two']})
    
    
    df2 = pd.DataFrame({'Name':['San Zhang', 'San Zhang'],
                        'Gender':['F', 'M'],
                        'Class':['two', 'one']})
    
    
    df1
    Out[14]: 
            Name  Age Class
    0  San Zhang   20   one
    1  San Zhang   21   two
    
    df2
    Out[15]: 
            Name Gender Class
    0  San Zhang      F   two
    1  San Zhang      M   one
    
    df1.merge(df2, on='Name', how='left') # 错误的结果,多对多连接
    Out[16]: 
            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') # 正确的结果,一对一连接
    Out[17]: 
            Name  Age Class Gender
    0  San Zhang   20   one      M
    1  San Zhang   21   two      F
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    用 duplicated 检查是否重复外, merge 中也提供了 validate 参数来检查连接的唯一性模式。
    这里共有三种模式,即一对一连接 1:1 ,一对多连接 1:m ,多对一连接 m:1 连接,第一个是指左右表的键都是唯一的,后面两个分别指左表键唯一和右表键唯一。

    2.索引连接
    所谓索引连接,就是把索引当作键,因此这和值连接本质上没有区别,。
    pandas 中利用 join 函数来处理索引连接,它的参数选择要少于 merge ,除了必须的 on 和 how 之外,可以对重复的列指定左右后缀 lsuffix 和 rsuffix 。其中, on 参数指索引名,单层索引时省略参数表示按照当前索引连接。

    df1 = pd.DataFrame({'Age':[20,30]},
                        index=pd.Series(
                        ['San Zhang','Si Li'],name='Name'))
    
    
    df2 = pd.DataFrame({'Gender':['F','M']},
                        index=pd.Series(
                        ['Si Li','Wu Wang'],name='Name'))
    
    
    df1.join(df2, how='left')
    Out[20]: 
               Age Gender
    Name                 
    San Zhang   20    NaN
    Si Li       30      F
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    文和数学分数合并的 join 版本
    df1.join(df2,how = ‘left’, lsuffix = ‘命名’, rsuffix(命名2))

    df1 = pd.DataFrame({'Grade':[70]},
                        index=pd.Series(['San Zhang'],
                        name='Name'))
    
    
    df2 = pd.DataFrame({'Grade':[80]},
                        index=pd.Series(['San Zhang'],
                        name='Name'))
    
    
    df1.join(df2, how='left', lsuffix='_Chinese', rsuffix='_Math')
    Out[23]: 
               Grade_Chinese  Grade_Math
    Name                                
    San Zhang             70          80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    二、方向连接

    1. concat
    pd.concat([df1, df2], axis=1, join=‘inner’)
    三个参数,它们是 axis, join, keys ,分别表示拼接方向,连接形式,以及在新表中指示来自于哪一张旧表的名字。

    axis=0 ,表示纵向拼接多个表,常常用于多个样本的拼接;而
    axis=1 表示横向拼接多个表,常用于多个字段或特征的拼接。

    pd.concat([df1, df2])  #纵向拼接
    pd.concat([df1, df2, df3], 1)  #横向拼接
    
    • 1
    • 2

    默认状态下 join=outer ,表示保留所有的列,并将不存在的值设为缺失;
    join=inner ,表示保留两个表都出现过的列

    2. 序列与表的合并
    如果想要把一个序列追加到表的行末或者列末,则可以分别使用 append 和 assign 方法。

    三、类连接操作

    pandas 中还设计了一些函数能够对两个表进行某些操作,这里把它们统称为类连接操作

    1. 比较
    compare能够比较两个表或者序列的不同处并将其汇总展示:

    df1 = pd.DataFrame({'Name':['San Zhang', 'Si Li', 'Wu Wang'],
                            'Age':[20, 21 ,21],
                            'Class':['one', 'two', 'three']})
    
    
    df2 = pd.DataFrame({'Name':['San Zhang', 'Li Si', 'Wu Wang'],
                            'Age':[20, 21 ,21],
                            'Class':['one', 'two', 'Three']})
    
    
    df1.compare(df2)
    Out[51]: 
        Name         Class       
        self  other   self  other
    1  Si Li  Li Si    NaN    NaN
    2    NaN    NaN  three  Three
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    结果中返回了不同值所在的行列,如果相同则会被填充为缺失值 NaN ,其中 other 和 self 分别指代传入的参数表和被调用的表自身。
    如果想要完整显示表中所有元素的比较情况,可以设置 keep_shape=True :

    df1.compare(df2, keep_shape=True)
    Out[52]: 
        Name         Age        Class       
        self  other self other   self  other
    0    NaN    NaN  NaN   NaN    NaN    NaN
    1  Si Li  Li Si  NaN   NaN    NaN    NaN
    2    NaN    NaN  NaN   NaN  three  Three
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2. 组合
    combine能够让两张表按照一定的规则进行组合,在进行规则比较时会自动进行列索引的对齐。

  • 相关阅读:
    解决spawn-fcgi:child exited with: 127/126/1报错
    基于Spring-AOP的自定义分片工具
    分布式计算实验5:HDFS论文阅读
    C语言 深度探究C语言中的多字节字符
    【架构设计】.Net Core负载均衡实现
    美容行业小程序开发有哪些功能?
    STM32的启动流程
    fmp4打包H265视频流
    npm ERR! code ERESOLVE,npm ERR! ERESOLVE unable to resolve dependency tree
    互联网内卷严重?你咋不看看其他行业呢?无非是三十晚上无月亮,大家都一样
  • 原文地址:https://blog.csdn.net/Sun123234/article/details/126444289