学科分类
目录
数据分析

主键合并数据

主键合并类似于关系型数据库的连接方式,它是指根据一个或多个键将不同的DatFrame对象连接起来,大多数是将两个DatFrame对象中重叠的列作为合并的键。Pandas中提供了用于主键合并的merge()函数,其语法格式如下:

pandas.merge(left, right, how='inner',on=None,left_on=None,right_on=Noneleft_index=False,
             right_index=False, sort=False,suffixes=('_x', '_y'), copy=True,
             indicator=False,validate=None)

上述函数中部分参数表示的含义如下:

(1) left:参与合并的左侧DataFrame对象。

(2) right:参与合并的右侧DataFrame对象。

(3) how:表示连接方式,默认为inner,how参数可以取下列值:

  • left:使用左侧的DataFrame的键,类似SQL的左外连接。

  • right:使用右侧的DataFrame的键,类似SQL的右外连接。

  • outer:使用两个DataFrame所有的键,类似SQL的全连接。

  • inner:使用两个DataFrame键的交集,类似SQL的内连接

(4) on:用于连接的列名。必须存在于左右两个DataFrame对象中。

(5) left_on:以左侧DataFrame做为连接键。

(6) right_on:以右侧DataFrame做为连接键。

(7) left_index:左侧的行索引用作连接键。

(8) right_index : 右侧的行索引用作连接键。

(9) sort:是否排序,接收布尔值,默认为False。

(10) suffixes:用于追加到重叠列名的末尾,默认为(_x,_y)。

在使用merge()函数进行合并时,默认会使用重叠的列索引做为合并键,并采用内连接方式合并数据,即取行索引重叠的部分。

merge()函数的典型应用场景是,针对同一个主键存在两张不同字段的表,根据主键整合到一张表里面。例如,图1中的left表和right表中均有索引为“key”的一列数据,并且这一列有重叠的数据。这两张表进行主键合并后的结果如result表。

img

图1 主键合并示意图

接下来,通过示例演示如何使用merge()函数将left表与right表进行合并,具体代码如下。

In [27]: import pandas as pd
         left = pd.DataFrame({'key':['K0','K1','K2'],'A':['A0','A1','A2'],
                              'B':['B0','B1','B2']})
         right = pd.DataFrame({'key':['K0','K1','K2','K3'],'C':['C0','C1','C2','C3'],
                               'D':['D0','D1','D2','D3']})
         pd.merge(left, right, on='key')

Out[27]:
  key  A  B  C  D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2

上述代码中,创建了两个DataFrame类对象left与right,然后使用merge()函数按照key列进行合并。

除此之外,merge()函数还支持对含有多个重叠列的DataFrame对象进行合并。在图2中,left表与right表中存在两个列名相同,数据相似的列索引,分别为key和B。用key、B做为合并键,合并后得到的结果如result表所示。

img

图2 两个主键合并

接下来,通过代码实现left表和right表以key、B做为合并键的合并效果,具体代码如下:

In [28]: import pandas as pd
         left = pd.DataFrame({'key':['K0','K1','K2'],'A':['A0','A1','A2'],
                              'B':['B0','B1','B2']})
         right = pd.DataFrame({'key':['K0','K5','K2','K4'],
                               'B':['B0','B1','B2','B5'],
                               'C':['C0','C1','C2','C3'],
                               'D':['D0','D1','D2','D3']})
         pd.merge(left, right, on=['key', 'B'])

Out[28]:
 key  A  B  C  D
0 K0 A0 B0 C0 D0
1 K2 A2 B2 C2 D2

上述代码中分别创建了两个DataFrame对象,分别是left和right。其中,left对象具有key、A、B三列数据,right对象具有key、B、C、D四列数据,然后调用merge()函数采用内连接的方式合并left和right,并使用列名相同的列索引key和B作为合并键,进行数据合并。

merge()函数支持内连接(inner)、外连接(outer)、左连接(left)、右连接(right)四种合并方式,merge()函数中how参数的值默认为inner,表示使用内连接方式合并,接下来通过修改how参数的值演示另外3种连接方式。

如图3所示采用的是外连接的合并方式,使用外连接的方式将left与right进行合并时,列中相同的数据会重叠,没有数据的位置使用NaN进行填充。

img

图3 外连接示例

如图4所示采用的是左连接方式将left与right进行合并,左连接是以左表为基准进行连接,所以left表中的数据会全部显示,right表中只会显示与重叠数据行索引值相同的数据,合并后表中缺失的数据会使用NaN进行填充。

img

图4 左连接方式

如图5所示采用的是左连接方式将left与right进行合并,右连接与左连接的规则正好相反,右连接是以右表为基准,右表中的数据全部显示,而左表中显示与重叠数据行索引值相同的数据,合并后缺失的数据使用NaN填充合并。

img

图5 右连接合并示例

假设两张表中的行索引与列索引均没有重叠的部分,但依旧可以使用merge函数来合并。

现有如图6所示的数据,在left表中的索引与right表中的索引没有重叠部分,当使用merge()函数合并时,只需要将参数left_index与right_index的值设置为True即可。

img

图6 合并示意图

接下来,通过编写代码展示图4-18所示的效果,具体如下:

In [29]: import pandas as pd
         left = pd.DataFrame({'A':['A0','A1','A2'],
                              'B':['B0','B1','B2']})
         right = pd.DataFrame({'C':['C0','C1','C2'],
                               'D':['D0','D1','D2']})
         pd.merge(left,right,how='outer',left_index=True,right_index=True)
Out[29]:
​        A  B  C  D
​    0  A0  B0 NaN NaN1  A1  B1 NaN NaN2  A2  B2 NaN NaN
​    a NaN NaN  C0  D0
​    b NaN NaN  C1  D1
​    c NaN NaN  C2  D2
点击此处
隐藏目录