Pandas merge并操作

1年前 (2024-04-27)
Pandas 提供的 merge() 函数能够进行高效的并操作,这与 SQL 关系型数据库的 MERGE 用法非常相似。从字面意思上不难理解,merge 翻译为“并”,指的是将两个 DataFrame 数据表按照指定的规则进行连接,拼接成一个新的 DataFrame 数据表。

 merge() 函数的法格式如下:

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,left_index=False, right_index=False, sort=True,suffixes=('_x', '_y'), copy=True)

参数说明,如下表所示:

参数名称

说明

left/right

两个不同的 DataFrame 对象。

on

指定用于连接的键(即列标签的名字),该键必须同时存在于左右两个 DataFrame 中,如果没有指定,并且其他参数也未指定, 那么将会以两个 DataFrame 的列名交集做为连接键。

left_on

指定左侧 DataFrame 中作连接键的列名。该参数在左、右列标签名不相同,但表达的含义相同时非常有用。

right_on

指定左侧 DataFrame 中作连接键的列名。

left_index

布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键,若 DataFrame 具有多层

索引(MultiIndex),则层的数量必须与连接键的数量相等。

right_index

布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键。

how

要执行的并类型,从 {'left', 'right', 'outer', 'inner'} 中取值,默认为“inner”内连接。

sort

布尔值参数,默认为True,它会将并后的数据进行排序;若设置为 False,则按照 how 给定的参数值进行排序。

suffixes

字符串组成的元组。当左右 DataFrame 存在相同列名时,通过该参数可以在相同的列名后附加后缀名,默认为('_x','_y')。

copy

默认为 True,表示对数据进行。

注意:Pandas 库的 merge() 支持各种内外连接,与其相似的还有 join() 函数(默认为左连接)。


下面创建两个不同的 DataFrame,然后对它们进行并操作:

import pandas as pd

left = pd.DataFrame({

'id':[1,2,3,4],

'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],

'subject_id':['sub1','sub2','sub4','sub6']})

right = pd.DataFrame({

'id':[1,2,3,4],

'Name': ['William', 'Albert', 'Tony', 'Allen'],

'subject_id':['sub2','sub4','sub3','sub6']})

print (left)

print (right)

输出如下:

id Name subject_id

0 1 Smith sub1

1 2 Maiki sub2

2 3 Hunter sub4

3 4 Hilen sub6

id Name subject_id

0 1 William sub2

1 2 Albert sub4

2 3 Tony sub3

3 4 Allen sub6

1) 在单个键上进行并操作

通过 on 参数指定一个连接键,然后对上述 DataFrame 进行并操作:

import pandas as pd

left = pd.DataFrame({

'id':[1,2,3,4],

'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],

'subject_id':['sub1','sub2','sub4','sub6']})

right = pd.DataFrame({

'id':[1,2,3,4],

'Name': ['William', 'Albert', 'Tony', 'Allen'],

'subject_id':['sub2','sub4','sub3','sub6']})

#通过on参数指定并的键

print(pd.merge(left,right,on='id'))

输出结果:

id Name_x subject_id_x Name_y subject_id_y

0 1 Smith sub1 William sub2

1 2 Maiki sub2 Albert sub4

2 3 Hunter sub4 Tony sub3

3 4 Hilen sub6 Allen sub6

2) 在多个键上进行并操作

下面示例,指定多个键来并上述两个 DataFrame 对象:

import pandas as pd

left = pd.DataFrame({

'id':[1,2,3,4],

'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],

'subject_id':['sub1','sub2','sub4','sub6']})

right = pd.DataFrame({

'id':[1,2,3,4],

'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],

'subject_id':['sub2','sub4','sub3','sub6']})

print(pd.merge(left,right,on=['id','subject_id']))

输出结果:

id Name_x subject_id Name_y

0 4 Hilen sub6 Mike

使用how参数并

通过how参数可以确定 DataFrame 中要包含哪些键,如果在左表、右表都不存的键,那么并后该键对应的值为 NaN。为了便于大家学习,我们将 how 参数和与其等价的 SQL 语句做了总结:

Merge方法

等效 SQL

描述

left

LEFT OUTER JOIN

使用左侧对象的key

right

RIGHT OUTER JOIN

使用右侧对象的key

outer

FULL OUTER JOIN

使用左右两侧所有key的并集

inner

INNER JOIN

使用左右两侧key的交集

1) left join

import pandas as pd

left = pd.DataFrame({

'id':[1,2,3,4],

'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],

'subject_id':['sub1','sub2','sub4','sub6']})

right = pd.DataFrame({

'id':[1,2,3,4],

'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],

'subject_id':['sub2','sub4','sub3','sub6']})

#以left侧的subject_id为键

print(pd.merge(left,right,on='subject_id',how="left"))

输出结果:

id_x Name_x subject_id id_y Name_y

0 1 Smith sub1 NaN NaN

1 2 Maiki sub2 1.0 Bill

2 3 Hunter sub4 2.0 Lucy

3 4 Hilen sub6 4.0 Mike

2) right join

import pandas as pd

left = pd.DataFrame({

'id':[1,2,3,4],

'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],

'subject_id':['sub1','sub2','sub4','sub6']})

right = pd.DataFrame({

'id':[1,2,3,4],

'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],

'subject_id':['sub2','sub4','sub3','sub6']})

#以right侧的subject_id为键

print(pd.merge(left,right,on='subject_id',how="right"))

输出结果:

id_x Name_x subject_id id_y Name_y

0 2.0 Maiki sub2 1 Bill

1 3.0 Hunter sub4 2 Lucy

2 4.0 Hilen sub6 4 Mike

3 NaN NaN sub3 3 Jack

3) outer join(并集)

import pandas as pd

left = pd.DataFrame({

'id':[1,2,3,4],

'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],

'subject_id':['sub1','sub2','sub4','sub6']})

right = pd.DataFrame({

'id':[1,2,3,4],

'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],

'subject_id':['sub2','sub4','sub3','sub6']})

#求出两个subject_id的并集,并作为键

print(pd.merge(left,right,on='subject_id',how="outer"))

输出结果:

id_x Name_x subject_id id_y Name_y

0 1.0 Smith sub1 NaN NaN

1 2.0 Maiki sub2 1.0 Bill

2 3.0 Hunter sub4 2.0 Lucy

3 4.0 Hilen sub6 4.0 Mike

4 NaN NaN sub3 3.0 Jack

4) inner join(交集)

import pandas as pd

left = pd.DataFrame({

'id':[1,2,3,4],

'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],

'subject_id':['sub1','sub2','sub4','sub6']})

right = pd.DataFrame({

'id':[1,2,3,4],

'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],

'subject_id':['sub2','sub4','sub3','sub6']})

#求出两个subject_id的交集,并将结果作为键

print(pd.merge(left,right,on='subject_id',how="inner"))

输出结果:

id_x Name_x subject_id id_y Name_y

0 2 Maiki sub2 1 Bill

1 3 Hunter sub4 2 Lucy

2 4 Hilen sub6 4 Mike

注意:当 a 与 b 进行内连操作时 a.join(b) 不等于 b.join(a)。