主键合并数据
主键合并类似于关系型数据库的连接方式,它是指根据一个或多个键将不同的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表。
图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表所示。
图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进行填充。
图3 外连接示例
如图4所示采用的是左连接方式将left与right进行合并,左连接是以左表为基准进行连接,所以left表中的数据会全部显示,right表中只会显示与重叠数据行索引值相同的数据,合并后表中缺失的数据会使用NaN进行填充。
图4 左连接方式
如图5所示采用的是左连接方式将left与right进行合并,右连接与左连接的规则正好相反,右连接是以右表为基准,右表中的数据全部显示,而左表中显示与重叠数据行索引值相同的数据,合并后缺失的数据使用NaN填充合并。
图5 右连接合并示例
假设两张表中的行索引与列索引均没有重叠的部分,但依旧可以使用merge函数来合并。
现有如图6所示的数据,在left表中的索引与right表中的索引没有重叠部分,当使用merge()函数合并时,只需要将参数left_index与right_index的值设置为True即可。
图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 NaN
1 A1 B1 NaN NaN
2 A2 B2 NaN NaN
a NaN NaN C0 D0
b NaN NaN C1 D1
c NaN NaN C2 D2