Pandas - 合并/连接

  • 简述

    Pandas 具有全功能、高性能的内存连接操作,在惯用上与 SQL 等关系数据库非常相似。
    Pandas 提供单一功能,merge,作为 DataFrame 对象之间所有标准数据库连接操作的入口点 -
    
    pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
    left_index=False, right_index=False, sort=True)
    
    在这里,我们使用了以下参数 -
    • left- 一个 DataFrame 对象。
    • right− 另一个 DataFrame 对象。
    • on- 要加入的列(名称)。必须在左右 DataFrame 对象中都找到。
    • left_on- 左侧 DataFrame 中用作键的列。可以是列名或长度等于 DataFrame 长度的数组。
    • right_on- 来自正确 DataFrame 的列用作键。可以是列名或长度等于 DataFrame 长度的数组。
    • left_index- 如果True,使用左侧 DataFrame 中的索引(行标签)作为其连接键。对于具有 MultiIndex(分层)的 DataFrame,级别的数量必须与来自正确 DataFrame 的连接键的数量相匹配。
    • right_index− 用法相同left_index对于正确的 DataFrame。
    • how- 'left', 'right', 'outer', 'inner'之一。默认为内部。下面描述了每种方法。
    • sort− 按字典顺序按连接键对结果 DataFrame 进行排序。默认为 True,设置为 False 在许多情况下会显着提高性能。
    现在让我们创建两个不同的 DataFrame 并对其执行合并操作。
    
    # import the pandas library
    import pandas as pd
    left = pd.DataFrame({
       'id':[1,2,3,4,5],
       'Name': ['Alex', 'Amy', 'Allen', 'Mooce', 'Ayoung'],
       'subject_id':['sub1','sub2','sub4','sub6','sub5']})
    right = pd.DataFrame(
       {'id':[1,2,3,4,5],
       'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
       'subject_id':['sub2','sub4','sub3','sub6','sub5']})
    print left
    print right
    
    它的output如下 -
    
        Name  id   subject_id
    0   Alex   1         sub1
    1    Amy   2         sub2
    2  Allen   3         sub4
    3  Mooce   4         sub6
    4  Ayoung  5         sub5
        Name  id   subject_id
    0  Billy   1         sub2
    1  Brian   2         sub4
    2  Bran    3         sub3
    3  Bryce   4         sub6
    4  Betty   5         sub5
    

    在一个键上合并两个 DataFrame

    
    import pandas as pd
    left = pd.DataFrame({
       'id':[1,2,3,4,5],
       'Name': ['Alex', 'Amy', 'Allen', 'Mooce', 'Ayoung'],
       'subject_id':['sub1','sub2','sub4','sub6','sub5']})
    right = pd.DataFrame({
         'id':[1,2,3,4,5],
       'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
       'subject_id':['sub2','sub4','sub3','sub6','sub5']})
    print pd.merge(left,right,on='id')
    
    它的output如下 -
    
       Name_x   id  subject_id_x   Name_y   subject_id_y
    0  Alex      1          sub1    Billy           sub2
    1  Amy       2          sub2    Brian           sub4
    2  Allen     3          sub4     Bran           sub3
    3  Mooce     4          sub6    Bryce           sub6
    4  Ayoung    5          sub5    Betty           sub5
    

    在多个键上合并两个 DataFrame

    
    import pandas as pd
    left = pd.DataFrame({
       'id':[1,2,3,4,5],
       'Name': ['Alex', 'Amy', 'Allen', 'Mooce', 'Ayoung'],
       'subject_id':['sub1','sub2','sub4','sub6','sub5']})
    right = pd.DataFrame({
         'id':[1,2,3,4,5],
       'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
       'subject_id':['sub2','sub4','sub3','sub6','sub5']})
    print pd.merge(left,right,on=['id','subject_id'])
    
    它的output如下 -
    
        Name_x   id   subject_id   Name_y
    0    Mooce    4         sub6    Bryce
    1   Ayoung    5         sub5    Betty
    
  • 使用 'how' 参数合并

    howmerge 的参数指定如何确定要在结果表中包含哪些键。如果左表或右表中均未出现组合键,则连接表中的值将为 NA。
    这里是总结how选项及其 SQL 等效名称 -
    合并方法 SQL 等效项 描述
    left 左外连接 使用左侧对象的键
    right 右外连接 使用正确对象的键
    outer 全外连接 使用键并集
    inner 内部联接 使用键的交集

    左连接

    
    import pandas as pd
    left = pd.DataFrame({
       'id':[1,2,3,4,5],
       'Name': ['Alex', 'Amy', 'Allen', 'Mooce', 'Ayoung'],
       'subject_id':['sub1','sub2','sub4','sub6','sub5']})
    right = pd.DataFrame({
       'id':[1,2,3,4,5],
       'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
       'subject_id':['sub2','sub4','sub3','sub6','sub5']})
    print pd.merge(left, right, on='subject_id', how='left')
    
    它的output如下 -
    
        Name_x   id_x   subject_id   Name_y   id_y
    0     Alex      1         sub1      NaN    NaN
    1      Amy      2         sub2    Billy    1.0
    2    Allen      3         sub4    Brian    2.0
    3    Mooce      4         sub6    Bryce    4.0
    4   Ayoung      5         sub5    Betty    5.0
    

    右连接

    
    import pandas as pd
    left = pd.DataFrame({
       'id':[1,2,3,4,5],
       'Name': ['Alex', 'Amy', 'Allen', 'Mooce', 'Ayoung'],
       'subject_id':['sub1','sub2','sub4','sub6','sub5']})
    right = pd.DataFrame({
       'id':[1,2,3,4,5],
       'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
       'subject_id':['sub2','sub4','sub3','sub6','sub5']})
    print pd.merge(left, right, on='subject_id', how='right')
    
    它的output如下 -
    
        Name_x  id_x   subject_id   Name_y   id_y
    0      Amy   2.0         sub2    Billy      1
    1    Allen   3.0         sub4    Brian      2
    2    Mooce   4.0         sub6    Bryce      4
    3   Ayoung   5.0         sub5    Betty      5
    4      NaN   NaN         sub3     Bran      3
    

    外连接

    
    import pandas as pd
    left = pd.DataFrame({
       'id':[1,2,3,4,5],
       'Name': ['Alex', 'Amy', 'Allen', 'Mooce', 'Ayoung'],
       'subject_id':['sub1','sub2','sub4','sub6','sub5']})
    right = pd.DataFrame({
       'id':[1,2,3,4,5],
       'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
       'subject_id':['sub2','sub4','sub3','sub6','sub5']})
    print pd.merge(left, right, how='outer', on='subject_id')
    
    它的output如下 -
    
        Name_x  id_x   subject_id   Name_y   id_y
    0     Alex   1.0         sub1      NaN    NaN
    1      Amy   2.0         sub2    Billy    1.0
    2    Allen   3.0         sub4    Brian    2.0
    3    Mooce   4.0         sub6    Bryce    4.0
    4   Ayoung   5.0         sub5    Betty    5.0
    5      NaN   NaN         sub3     Bran    3.0
    

    内部联接

    连接将在索引上执行。连接操作尊重调用它的对象。所以,a.join(b)不等于b.join(a).
    
    import pandas as pd
    left = pd.DataFrame({
       'id':[1,2,3,4,5],
       'Name': ['Alex', 'Amy', 'Allen', 'Mooce', 'Ayoung'],
       'subject_id':['sub1','sub2','sub4','sub6','sub5']})
    right = pd.DataFrame({
       'id':[1,2,3,4,5],
       'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],
       'subject_id':['sub2','sub4','sub3','sub6','sub5']})
    print pd.merge(left, right, on='subject_id', how='inner')
    
    它的output如下 -
    
        Name_x   id_x   subject_id   Name_y   id_y
    0      Amy      2         sub2    Billy      1
    1    Allen      3         sub4    Brian      2
    2    Mooce      4         sub6    Bryce      4
    3   Ayoung      5         sub5    Betty      5