zoukankan      html  css  js  c++  java
  • pandas合并merge-【老鱼学pandas】

    本节讲述对于两个数据集按照相同列的值进行合并。

    首先定义原始数据:

    import pandas as pd
    import numpy as np
    data0 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                          'A': ['A0', 'A1', 'A2', 'A3'],
                          'B': ['B0', 'B1', 'B2', 'B3']
                          })
    data1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                          'C': ['C0', 'C1', 'C2', 'C3'],
                          'D': ['D0', 'D1', 'D2', 'D3']
                          })
    print("data0:")
    print(data0)
    
    print("data1:")
    print(data1)
    
    

    输出为:

    data0:
        A   B key
    0  A0  B0  K0
    1  A1  B1  K1
    2  A2  B2  K2
    3  A3  B3  K3
    data1:
        C   D key
    0  C0  D0  K0
    1  C1  D1  K1
    2  C2  D2  K2
    3  C3  D3  K3
    
    

    啥也不做,直接合并:

    print(pd.merge(data0, data1))
    

    输出为:

        A   B key   C   D
    0  A0  B0  K0  C0  D0
    1  A1  B1  K1  C1  D1
    2  A2  B2  K2  C2  D2
    3  A3  B3  K3  C3  D3
    

    默认情况下的合并是根据两个数据集中共同的列拥有相同的值来进行合并的。

    我们再举一个例子,大家可以观察下:

    import pandas as pd
    import numpy as np
    data0 = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                          'key2': ['K0', 'K1', 'K0', 'K1'],
                          'A': ['A0', 'A1', 'A2', 'A3'],
                          'B': ['B0', 'B1', 'B2', 'B3']
                          })
    data1 = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                          'key2': ['K0', 'K0', 'K0', 'K0'],
                          'C': ['C0', 'C1', 'C2', 'C3'],
                          'D': ['D0', 'D1', 'D2', 'D3']
                          })
    print("data0:")
    print(data0)
    
    print("data1:")
    print(data1)
    
    print("合并后的数据为:")
    print(pd.merge(data0, data1))
    

    输出为:

    data0:
        A   B key1 key2
    0  A0  B0   K0   K0
    1  A1  B1   K0   K1
    2  A2  B2   K1   K0
    3  A3  B3   K2   K1
    data1:
        C   D key1 key2
    0  C0  D0   K0   K0
    1  C1  D1   K1   K0
    2  C2  D2   K1   K0
    3  C3  D3   K2   K0
    合并后的数据为:
        A   B key1 key2   C   D
    0  A0  B0   K0   K0  C0  D0
    1  A2  B2   K1   K0  C1  D1
    2  A2  B2   K1   K0  C2  D2
    

    在merge参数中可以添加how的参数,这个参数默认为inner,可选值有:
    left,right,outer,inner。

    对于how='outer'
    不管key有没有一模一样,都把它们给复制下来,例如:

    print(pd.merge(data0, data1, how='outer'))
    

    输出为:

         A    B key1 key2    C    D
    0   A0   B0   K0   K0   C0   D0
    1   A1   B1   K0   K1  NaN  NaN
    2   A2   B2   K1   K0   C1   D1
    3   A2   B2   K1   K0   C2   D2
    4   A3   B3   K2   K1  NaN  NaN
    5  NaN  NaN   K2   K0   C3   D3
    

    如果我们设置how='right',则输出结果会以第二个数据集的key为准:

    print(pd.merge(data0, data1, how='right'))
    

    输出为:

         A    B key1 key2   C   D
    0   A0   B0   K0   K0  C0  D0
    1   A2   B2   K1   K0  C1  D1
    2   A2   B2   K1   K0  C2  D2
    3  NaN  NaN   K2   K0  C3  D3
    

    indicator

    indicator参数用来指示出当前记录的合并方式,例如:

    print(pd.merge(data0, data1, indicator=True, how='outer'))
    

    输出:

         A    B key1 key2    C    D      _merge
    0   A0   B0   K0   K0   C0   D0        both
    1   A1   B1   K0   K1  NaN  NaN   left_only
    2   A2   B2   K1   K0   C1   D1        both
    3   A2   B2   K1   K0   C2   D2        both
    4   A3   B3   K2   K1  NaN  NaN   left_only
    5  NaN  NaN   K2   K0   C3   D3  right_only
    

    目前,indicator默认的列名为 _merge,如果你看着不爽,可以通过indicator="字段名"的方式来修改这个字段名。

    按照index进行合并

    前面是通过字段名来进行合并的,但有时我们可以把index看成是一个主键,这样就相当于根据主键进行合并数据,例如:

    import pandas as pd
    import numpy as np
    data0 = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                          'key2': ['K0', 'K1', 'K0', 'K1'],
                          'A': ['A0', 'A1', 'A2', 'A3'],
                          'B': ['B0', 'B1', 'B2', 'B3']
                          }, index=["T0", "T1", "T2", "T3"])
    data1 = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                          'key2': ['K0', 'K0', 'K0', 'K0'],
                          'C': ['C0', 'C1', 'C2', 'C3'],
                          'D': ['D0', 'D1', 'D2', 'D3']
                          },
                         index=["T0", "T1", "T4", "T5"])
    print("data0:")
    print(data0)
    
    print("data1:")
    print(data1)
    
    print("合并后的数据为:")
    print(pd.merge(data0, data1, left_index=True, right_index=True))
    

    输出为:

    data0:
         A   B key1 key2
    T0  A0  B0   K0   K0
    T1  A1  B1   K0   K1
    T2  A2  B2   K1   K0
    T3  A3  B3   K2   K1
    data1:
         C   D key1 key2
    T0  C0  D0   K0   K0
    T1  C1  D1   K1   K0
    T4  C2  D2   K1   K0
    T5  C3  D3   K2   K0
    合并后的数据为:
         A   B key1_x key2_x   C   D key1_y key2_y
    T0  A0  B0     K0     K0  C0  D0     K0     K0
    T1  A1  B1     K0     K1  C1  D1     K1     K0
    

    这里需要同时设置left_index=True, right_index=True

    相同列名添加后缀区分

    如果我们不加任何后缀的情况下,系统会自动添加_x,_y之类的后缀进行区分,例如:

    import pandas as pd
    import numpy as np
    data0 = pd.DataFrame({'k': ['K0', 'K1', 'K2'],
                          'age': [1, 2, 3]})
    data1 = pd.DataFrame({'k': ['K0', 'K0', 'K3'],
                          'age': [4, 5, 6]})
    
    print("data0:")
    print(data0)
    
    print("data1:")
    print(data1)
    
    print("合并后的数据为:")
    print(pd.merge(data0, data1, on='k'))
    

    输出为:

    data0:
       age   k
    0    1  K0
    1    2  K1
    2    3  K2
    data1:
       age   k
    0    4  K0
    1    5  K0
    2    6  K3
    合并后的数据为:
       age_x   k  age_y
    0      1  K0      4
    1      1  K0      5
    

    我们可以通过suffixes属性来修改默认的后缀名:

    print(pd.merge(data0, data1, on='k', suffixes=['_boy', '_girl']))
    

    输出为:

       age_boy   k  age_girl
    0        1  K0         4
    1        1  K0         5
    
  • 相关阅读:
    Linux常用快捷键
    如何Oracle 数据库备份与恢复
    Linux常用命令解释
    转摘:商业智能BI的演绎型需求和归纳型需求BI三维框架之内容维研究
    PHP中const的使用
    PHP中define的使用
    Apache配置正向代理与反向代理
    正向代理
    JAVA System.getProperty()参数
    PHP查找当前URL文件扩展名
  • 原文地址:https://www.cnblogs.com/dreampursuer/p/7845153.html
Copyright © 2011-2022 走看看