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
posted @ 2017-11-25 10:04  dreampursuer  阅读(502)  评论(0编辑  收藏  举报