Pandas合并操作(merge)

Pandas 常用的合并方法有 joinmergeconcat 三种,本文我们来看看 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_onright_on 需要搭配使用,上面的 on 参数是左右同名的列名或索引,如果想操作的左右两个数据的列名或者索引不一样,就需要使用 left_onright_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_data
  • right_only,最终 key 只存在于 right_data
  • both,最终 key 在 left_dataright_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,不做验证

返回值

返回合并后的数据。

例子

1
2
>>> 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']})
1
2
3
4
5
6
7
>>> a
ID name
0 1 a
1 2 b
2 3 c
3 4 d
4 5 e
1
2
3
4
5
6
>>> b
ID name
0 2 p2
1 3 p3
2 4 p4
3 5 e

on

1
2
3
>>> a.merge(b)
ID name
0 5 e

如果不指定 onleft_onright_onleft_indexright_index,那么默认会把左右两侧数据所有相同的列名作为 merge key,必须所有相同的列对应的值都一样才可以。

1
2
3
4
5
6
7
>>> 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

1
2
3
>>> a.merge(b, left_on='name', right_on='city')
ID_x name ID_y city
0 5 e 5 e

aname 列和 bcity 列作合并操作,因为只有值为 e 的数据是相同的,所以最后就剩下了这么一行。