分享

pandas——Merge做表之间的连接

 LibraryPKU 2022-06-13 发布于北京

基于某个column或某些columns做连接

连接时有4种方法how = ['left’, 'right’, 'outer’, 'inner’],默认值how='inner’

  • how='inner’ 默认值,内连接(sql中的自然连接)。按参数on的值交,其实就是键的交集(数据块系统概论54页,详细)

  • how='outer’ 外连接,按参数on的值并,并了之后其他特征上没有值的会NaN补

  • how='left’ 左连接,是以第一个 DataFrame 为主进行的连接,第二个DataFrame作为补充

  • how='right’ 右连接,是以第二个 DataFrame 为主进行的连接,第一个DataFrame作为补充

一个公共column

import pandas as pd

特殊:公共属性:key , 很巧,两个key的值(数量、内容)一模一样,那就很简单了,四种连接方式结果一模一样

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']})right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],  'C': ['C0', 'C1', 'C2', 'C3'],  'D': ['D0', 'D1', 'D2', 'D3']})print(left)print(right)
    A   B key
0  A0  B0  K0
1  A1  B1  K1
2  A2  B2  K2
3  A3  B3  K3
    C   D key
0  C0  D0  K0
1  C1  D1  K1
2  C2  D2  K2
3  C3  D3  K3
pd.merge(left, right, on='key')

ABkeyCD
0A0B0K0C0D0
1A1B1K1C1D1
2A2B2K2C2D2
3A3B3K3C3D3

一般情况下为:公共column: key,两个表的key的值(数量、内容)不一样

一般情况下:
公共属性:key ,两个key的值不一样

key的交集:[k0, k1]
left1中的悬浮元组为:(A2, K2, K2)
left2中的悬浮元组为:(C4, D4, K4)

内连接:舍弃所有的悬浮元组,之后做连接
外连接:保留所有的悬浮元组,做连接,没值属性的补空NaN
左连接:只保留左表left的悬浮元组,做连接,右表上没值属性补NaN
右连接:只保留右表right的悬浮元组,做连接,左表上没值属性补NaN

看例子:

left1 = pd.DataFrame({'key': ['K0', 'K1', 'K2'], 'A': ['A0', 'A1', 'A2'], 'B': ['B0', 'B1', 'B2']})right1 = pd.DataFrame({'key': ['K0', 'K1', 'K1', 'K4'],  'C': ['C0', 'C1', 'C10', 'C4'],  'D': ['D0', 'D1', 'D10', 'D4']})print(left1)print(right1)
    A   B key
0  A0  B0  K0
1  A1  B1  K1
2  A2  B2  K2
     C    D key
0   C0   D0  K0
1   C1   D1  K1
2  C10  D10  K1
3   C4   D4  K4
#默认,内连接pd.merge(left1, right1, on='key')

ABkeyCD
0A0B0K0C0D0
1A1B1K1C1D1
2A1B1K1C10D10
#外连接pd.merge(left1, right1, on='key', how='outer')

ABkeyCD
0A0B0K0C0D0
1A1B1K1C1D1
2A1B1K1C10D10
3A2B2K2NaNNaN
4NaNNaNK4C4D4
#左连接pd.merge(left1, right1, on='key', how='left')

ABkeyCD
0A0B0K0C0D0
1A1B1K1C1D1
2A1B1K1C10D10
3A2B2K2NaNNaN
#右连接pd.merge(left1, right1, on='key', how='right')

ABkeyCD
0A0B0K0C0D0
1A1B1K1C1D1
2A1B1K1C10D10
3NaNNaNK4C4D4

两个公共columns,看看结果

left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],  'key2': ['K0', 'K1', 'K0', 'K1'],  'A': ['A0', 'A1', 'A2', 'A3'],  'B': ['B0', 'B1', 'B2', 'B3']})right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],   'key2': ['K0', 'K0', 'K0', 'K0'],   'C': ['C0', 'C1', 'C2', 'C3'],   'D': ['D0', 'D1', 'D2', 'D3']})print(left)print(right)
    A   B key1 key2
0  A0  B0   K0   K0
1  A1  B1   K0   K1
2  A2  B2   K1   K0
3  A3  B3   K2   K1
    C   D key1 key2
0  C0  D0   K0   K0
1  C1  D1   K1   K0
2  C2  D2   K1   K0
3  C3  D3   K2   K0

注意left和right的[key1,key2]的值有所不同

pd.merge(left,right,on=['key1','key2'])#默认:how=inner#看看效果:只保留了共同的[key1,key2]  inner连接:交

ABkey1key2CD
0A0B0K0K0C0D0
1A2B2K1K0C1D1
2A2B2K1K0C2D2
pd.merge(left, right, on=['key1','key2'], how='outer')#看看效果:outer连接:并 (没有值的就补NaN)

ABkey1key2CD
0A0B0K0K0C0D0
1A1B1K0K1NaNNaN
2A2B2K1K0C1D1
3A2B2K1K0C2D2
4A3B3K2K1NaNNaN
5NaNNaNK2K0C3D3
pd.merge(left, right, on=['key1','key2'], how='left')#left的key全保留,同时right在left里有的key保留

ABkey1key2CD
0A0B0K0K0C0D0
1A1B1K0K1NaNNaN
2A2B2K1K0C1D1
3A2B2K1K0C2D2
4A3B3K2K1NaNNaN
pd.merge(left, right, on=['key1','key2'], how='right')#

ABkey1key2CD
0A0B0K0K0C0D0
1A2B2K1K0C1D1
2A2B2K1K0C2D2
3NaNNaNK2K0C3D3

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多