Press "Enter" to skip to content

Pandas数据合并之pd.merge()函数

语法结构

pd.merge()可以将两个 DataFrame 或者 Series 进行连接:

pd.merge(left, right, 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,)

参数:

how:连接方式,默认为inner,可设为inner/outer/left/right

on:根据某个字段进行连接,必须存在于两个DateFrame中(若未同时存在,则需要分别使用left_on 和 right_on 来设置)

left_on:左连接,以DataFrame1中用作连接键的列

right_on:右连接,以DataFrame2中用作连接键的列

left_index:bool, default False,将DataFrame1行索引用作连接键

right_index:bool, default False,将DataFrame2行索引用作连接键

sort:根据连接键对合并后的数据进行排列,默认为True

suffixes:对两个数据集中出现的重复列,新数据集中加上后缀 _x, _y 进行区别


参数:left和right

pd.merge()只能用于两个表的拼接,而且通过参数名称也能看出连接方向是左右拼接,一个左表一个右表,而且参数中没有指定拼接轴的参数,所以pd.merge()不能用于表的上下拼接。

参数:on

这个参数确定哪个字段作为主键,(on为两个数据的连接键)

例如:

这两个表能够看出有两列列名是一样的,工号和员工姓名,而且自己看的话还能发现索引是5的记录虽然员工姓名一样但是工号不一样,有可能一个公司中出现了重名的员工,我们对这两个表进行拼接。

不指定主键的情况下:

由于pd.merge()默认的是内连接,所以只把主键信息相同的部分拼接,而工号和员工姓名完全一致的只有工号是004的信息

指定主键拼接:


参数left_index和right_index

除了指定字段作为主键以外,还可以考虑用索引作为拼接的主键,left_index和right_index默认为False,就是不以索引作为主键,如果想用索引作为拼接的主键,把left_index和right_index设置为Ture就可以了。


参数:how

how参数控制拼接方式,默认内连接(inner),可设为inner/outer/left/right

how='left' # 以左为表基表
how='right' # 以右为表基表
how='outer' # 取两个表的合集
how='inner' # 取两个表的交集

how=’outer’ # 取两个表的合集

保留两个表的所有信息,拼接的时候遇到标签不能对齐的部分,用NAN进行填充

how=’left’ # 以左为表基表

左连接是保留所有左表的信息,把右表中主键与左表一致的信息拼接进来,标签不能对齐的部分,用NAN进行填充:

how=’right’ # 以右为表基表

右连接是保留所有右表的信息,把左表中主键与左表一致的信息拼接进来,标签不能对齐的部分,用NAN进行填充:


参数:left_on和right_on

有的时候还会有这种情况,两个表里没有完全一致的列名,但是有信息一致的列,例如下边这种情况,都有”员工姓名”这一列,但是名字不一样:

这个时候需要指定每个表中用来做主键的字段是哪一个,就用到了left_on和right_on这两个参数


参数:sort=True

sort对链接的键值进行排序:紧接着上一例,设置sort= True


参数:indicator

在pd.concat()中可以通过参数设定显示拼接后的表中哪些信息来自于哪一个表格,在pd.merge()中也可以进行这样的操作,就是通过indicator参数设置,默认是False不显示数据来源,把参数设置为True就可以了。

这样在表的最后就会有一个新列,显示这一条记录来自于在哪表格里有数据,如果两表都有数据会标记both。

发表评论

您的电子邮箱地址不会被公开。