Pandas 常用的合并方法有 join
,merge
,concat
三种,本文我们来看看 merge
的用法。
merge
函数签名:
left_data.merge(right_data, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
merge
操作和数据库中的 join
操作类似。
merge
操作的可以是索引也可以是列。如果操作的是列,那么会忽略掉 DataFrame 的索引,否则无论操作的是索引对索引还是索引对列,索引都会传递过去的。
参数
看过之前那篇 Pandas合并操作 — join
的话,相信 merge
里面的大部分参数大家都已经很熟悉了。
right_data
和 left_data
进行合并操作的 DataFrame 或者命名的 Series。
how
合并的方式:left、right、outer、inner。
left:使用
left_data
的键执行合并操作,类似于 SQL 的left outer join
,按键的顺序排序。right:使用
right_data
的键执行合并操作,类似于 SQL 的right outer join
,按键的顺序排序。outer:使用左右两侧数据所有的键进行合并操作,类似于 SQL 的
full outer join
,按字典顺序排序。inner:使用两侧数据键的交集进行合并操作,类似 SQL 的
inner join
,按左侧数据的键顺序排序。
on
可接收单个字符串(也即是只按这列/索引合并)也可以接收一个列表(按这几个列/索引合并)。
不使用默认索引,而是按照 on
参数指定的列名或者索引进行合并操作。on
指定的名字必须在左右两侧的数据中都能找到,不然潘大叔会傻掉的,直接把错误扔给你去处理。
left_on
left_data
的哪个或哪些列/索引用来作为合并操作的基准。
right_on
right_data
的哪个或哪些列/索引用来作为合并操作的基准。
left_on
和 right_on
需要搭配使用,上面的 on
参数是左右同名的列名或索引,如果想操作的左右两个数据的列名或者索引不一样,就需要使用 left_on
和 right_on
参数。
left_index
默认 False
,是否使用 left_data
的索引来执行合并操作。如果是多层索引 right_data
也需要有同样层数的多级索引
right_index
默认 False
,是否使用 right_data
的索引来执行合并操作。如果是多层索引 left_data
也需要有同样层数的多级索引
如果 left_index=True
或者 right_index=True
,那么另一边的数据要么也使用索引,要么也可以使用上面的 left_on
或者 right_on
来指定对应的列或索引。
sort
是否按照 key 在字典中的字母顺序对结果排序(默认 False
)。
suffixes
合并的时候如果有相同的列名,是否通过增加后缀区分(默认 ('_x', '_y')
)。
(False, False)
表示如果有重复的列名就报错。
copy
默认 True
,如果设置为 False
,会在操作的过程中尽可能的减少复制操作。
indicator
默认 False
,如果为 True
,会增加一列叫做 _merge
的数据,表示每一行进行合并操作的类型。
如果设置为字符串,则用这个作为新增的列名。
一共有这几个合并类型:
left_only
,最终 key 只存在于left_dataright_only
,最终 key 只存在于right_databoth
,最终 key 在left_data
和right_data
中都有
validate
检测合并的类型:
one_to_one
或者1:1
,验证 key 在左右两侧数据中都是唯一的one_to_many
或者1:m
,验证 key 在左侧数据中是唯一的many_to_one
或者m:1
,验证 key 在右侧数据中是唯一的many_to_many
或者m:m
,不做验证
返回值
返回合并后的数据。
例子
>>> a = pd.DataFrame({'ID': [1, 2, 3, 4, 5], 'name': ['a', 'b', 'c', 'd', 'e']})
>>> b = pd.DataFrame({'ID': [2, 3, 4, 5], 'name': ['p2', 'p3', 'p4', 'e']})
>>> a
ID name
0 1 a
1 2 b
2 3 c
3 4 d
4 5 e
>>> b
ID name
0 2 p2
1 3 p3
2 4 p4
3 5 e
on
>>> a.merge(b)
ID name
0 5 e
如果不指定 on
、left_on
、right_on
、left_index
、right_index
,那么默认会把左右两侧数据所有相同的列名作为 merge key,必须所有相同的列对应的值都一样才可以。
>>> b = pd.DataFrame({'ID': [2, 3, 4, 5], 'city': ['p2', 'p3', 'p4', 'e']})
>>> a.merge(b)
ID name city
0 2 b p2
1 3 c p3
2 4 d p4
3 5 e e
如上,如果只有一列 ID
名字相同,则只合并 ID
对应值相同的行。
left_on right_on
>>> a.merge(b, left_on='name', right_on='city')
ID_x name ID_y city
0 5 e 5 e
以 a
的 name
列和 b
的 city
列作合并操作,因为只有值为 e
的数据是相同的,所以最后就剩下了这么一行。
-END-
相关阅读:





