暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Pandas合并操作 — merge

圆不遛球 2019-03-07
858

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_data

  • right_only
    ,最终 key 只存在于 right_data

  • both
    ,最终 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': [12345], 'name': ['a''b''c''d''e']})
>>> b = pd.DataFrame({'ID': [2345], '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': [2345], '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-


相关阅读:

Pandas合并操作 — join


文章转载自圆不遛球,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论