Pandas - 合并/连接
-
简述
Pandas 具有全功能、高性能的内存连接操作,在惯用上与 SQL 等关系数据库非常相似。Pandas 提供单一功能,merge,作为 DataFrame 对象之间所有标准数据库连接操作的入口点 -pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True)
在这里,我们使用了以下参数 --
left- 一个 DataFrame 对象。
-
right− 另一个 DataFrame 对象。
-
on- 要加入的列(名称)。必须在左右 DataFrame 对象中都找到。
-
left_on- 左侧 DataFrame 中用作键的列。可以是列名或长度等于 DataFrame 长度的数组。
-
right_on- 来自正确 DataFrame 的列用作键。可以是列名或长度等于 DataFrame 长度的数组。
-
left_index- 如果True,使用左侧 DataFrame 中的索引(行标签)作为其连接键。对于具有 MultiIndex(分层)的 DataFrame,级别的数量必须与来自正确 DataFrame 的连接键的数量相匹配。
-
right_index− 用法相同left_index对于正确的 DataFrame。
-
how- 'left', 'right', 'outer', 'inner'之一。默认为内部。下面描述了每种方法。
-
sort− 按字典顺序按连接键对结果 DataFrame 进行排序。默认为 True,设置为 False 在许多情况下会显着提高性能。
现在让我们创建两个不同的 DataFrame 并对其执行合并操作。# import the pandas library import pandas as pd left = pd.DataFrame({ 'id':[1,2,3,4,5], 'Name': ['Alex', 'Amy', 'Allen', 'Mooce', 'Ayoung'], 'subject_id':['sub1','sub2','sub4','sub6','sub5']}) right = pd.DataFrame( {'id':[1,2,3,4,5], 'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 'subject_id':['sub2','sub4','sub3','sub6','sub5']}) print left print right
它的output如下 -Name id subject_id 0 Alex 1 sub1 1 Amy 2 sub2 2 Allen 3 sub4 3 Mooce 4 sub6 4 Ayoung 5 sub5 Name id subject_id 0 Billy 1 sub2 1 Brian 2 sub4 2 Bran 3 sub3 3 Bryce 4 sub6 4 Betty 5 sub5
在一个键上合并两个 DataFrame
import pandas as pd left = pd.DataFrame({ 'id':[1,2,3,4,5], 'Name': ['Alex', 'Amy', 'Allen', 'Mooce', 'Ayoung'], 'subject_id':['sub1','sub2','sub4','sub6','sub5']}) right = pd.DataFrame({ 'id':[1,2,3,4,5], 'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 'subject_id':['sub2','sub4','sub3','sub6','sub5']}) print pd.merge(left,right,on='id')
它的output如下 -Name_x id subject_id_x Name_y subject_id_y 0 Alex 1 sub1 Billy sub2 1 Amy 2 sub2 Brian sub4 2 Allen 3 sub4 Bran sub3 3 Mooce 4 sub6 Bryce sub6 4 Ayoung 5 sub5 Betty sub5
在多个键上合并两个 DataFrame
import pandas as pd left = pd.DataFrame({ 'id':[1,2,3,4,5], 'Name': ['Alex', 'Amy', 'Allen', 'Mooce', 'Ayoung'], 'subject_id':['sub1','sub2','sub4','sub6','sub5']}) right = pd.DataFrame({ 'id':[1,2,3,4,5], 'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 'subject_id':['sub2','sub4','sub3','sub6','sub5']}) print pd.merge(left,right,on=['id','subject_id'])
它的output如下 -Name_x id subject_id Name_y 0 Mooce 4 sub6 Bryce 1 Ayoung 5 sub5 Betty
-
-
使用 'how' 参数合并
这howmerge 的参数指定如何确定要在结果表中包含哪些键。如果左表或右表中均未出现组合键,则连接表中的值将为 NA。这里是总结how选项及其 SQL 等效名称 -合并方法 SQL 等效项 描述 left 左外连接 使用左侧对象的键 right 右外连接 使用正确对象的键 outer 全外连接 使用键并集 inner 内部联接 使用键的交集 左连接
import pandas as pd left = pd.DataFrame({ 'id':[1,2,3,4,5], 'Name': ['Alex', 'Amy', 'Allen', 'Mooce', 'Ayoung'], 'subject_id':['sub1','sub2','sub4','sub6','sub5']}) right = pd.DataFrame({ 'id':[1,2,3,4,5], 'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 'subject_id':['sub2','sub4','sub3','sub6','sub5']}) print pd.merge(left, right, on='subject_id', how='left')
它的output如下 -Name_x id_x subject_id Name_y id_y 0 Alex 1 sub1 NaN NaN 1 Amy 2 sub2 Billy 1.0 2 Allen 3 sub4 Brian 2.0 3 Mooce 4 sub6 Bryce 4.0 4 Ayoung 5 sub5 Betty 5.0
右连接
import pandas as pd left = pd.DataFrame({ 'id':[1,2,3,4,5], 'Name': ['Alex', 'Amy', 'Allen', 'Mooce', 'Ayoung'], 'subject_id':['sub1','sub2','sub4','sub6','sub5']}) right = pd.DataFrame({ 'id':[1,2,3,4,5], 'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 'subject_id':['sub2','sub4','sub3','sub6','sub5']}) print pd.merge(left, right, on='subject_id', how='right')
它的output如下 -Name_x id_x subject_id Name_y id_y 0 Amy 2.0 sub2 Billy 1 1 Allen 3.0 sub4 Brian 2 2 Mooce 4.0 sub6 Bryce 4 3 Ayoung 5.0 sub5 Betty 5 4 NaN NaN sub3 Bran 3
外连接
import pandas as pd left = pd.DataFrame({ 'id':[1,2,3,4,5], 'Name': ['Alex', 'Amy', 'Allen', 'Mooce', 'Ayoung'], 'subject_id':['sub1','sub2','sub4','sub6','sub5']}) right = pd.DataFrame({ 'id':[1,2,3,4,5], 'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 'subject_id':['sub2','sub4','sub3','sub6','sub5']}) print pd.merge(left, right, how='outer', on='subject_id')
它的output如下 -Name_x id_x subject_id Name_y id_y 0 Alex 1.0 sub1 NaN NaN 1 Amy 2.0 sub2 Billy 1.0 2 Allen 3.0 sub4 Brian 2.0 3 Mooce 4.0 sub6 Bryce 4.0 4 Ayoung 5.0 sub5 Betty 5.0 5 NaN NaN sub3 Bran 3.0
内部联接
连接将在索引上执行。连接操作尊重调用它的对象。所以,a.join(b)不等于b.join(a).import pandas as pd left = pd.DataFrame({ 'id':[1,2,3,4,5], 'Name': ['Alex', 'Amy', 'Allen', 'Mooce', 'Ayoung'], 'subject_id':['sub1','sub2','sub4','sub6','sub5']}) right = pd.DataFrame({ 'id':[1,2,3,4,5], 'Name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 'subject_id':['sub2','sub4','sub3','sub6','sub5']}) print pd.merge(left, right, on='subject_id', how='inner')
它的output如下 -Name_x id_x subject_id Name_y id_y 0 Amy 2 sub2 Billy 1 1 Allen 3 sub4 Brian 2 2 Mooce 4 sub6 Bryce 4 3 Ayoung 5 sub5 Betty 5