我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

继续讨论pandas.merge()函数,本文讨论其中的onleft_onright_on三个参数,对应到sql语言里面,就是两者进行连接的on标准的选择问题。默认的on,必然是两者都有的某个列,比如id。但是,它是可以改变的。

苏南大叔:python编程,解读pandas.merge()合并dataframe的on标准 - dataframe-merge-on
python编程,解读pandas.merge()合并dataframe的on标准(图2-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码之间的故事。测试环境:python@3.6.8pandas@1.1.5numpy@1.24.4

前文回顾

本文是基于上一篇文章,关于两个dataframe的合并问题的文章的。参考:

本文所描述的pandas.merge()具有和数据库语句类似的on的特性,可以参考:

参数默认说明
on用于连接的列名,必须在两个DataFrame对象中都存在
left_on、right_on分别指定 left 和 right 的连接列

默认on

默认的on就是会自动选择两者都存在的列,本文里面就是列a,用于连接的列名,必须在两个DataFrame对象中都存在。

import pandas as pd
df1 = pd.DataFrame({'a':['苏','南'],'b':['大','叔']})
df2 = pd.DataFrame({'a': ['苏', 'su', '南'], 'c': ['da', 'shu', '哥']})

res = pd.merge(df1, df2)
print(res)

res = pd.merge(df1, df2, on='a')
print(res)

res = pd.merge(df1, df2, on=['a'])
print(res)

这里的三种写法是等效的结果,输出都是:

   a  b   c
0  苏  大  da
1  南  叔   哥

多列相同的情况

多个相同列的时候,比如下面的列a和列b,那么,默认的join标准就是两者都相同的时候。例如:

import pandas as pd
df1 = pd.DataFrame({'a': ['苏', '南'], 'b': ['大', '叔']})
df2 = pd.DataFrame({'a': ['苏', 'su', '南'], 'b': ['大', '叔', '苏'], 'c': ['da', 'shu', '哥']})
print(df1)
print(df2)

输出:

   a  b
0  苏  大
1  南  叔

    a  b    c
0   苏  大   da
1  su  叔  shu
2   南  苏    哥

苏南大叔:python编程,解读pandas.merge()合并dataframe的on标准 - merge的on参数
python编程,解读pandas.merge()合并dataframe的on标准(图2-2)

res = pd.merge(df1, df2)
print(res)

res = pd.merge(df1, df2, on=['a','b'])
print(res)

输出都是:

   a  b   c
0  苏  大  da

ab相同列做一个单位,求合集。

res = pd.merge(df1, df2, on=['a','b'], how='outer')
print(res)

输出:

    a  b    c
0   苏  大   da
1   南  叔  NaN
2  su  叔  shu
3   南  苏    哥

多列取其一

虽然同时有两个相同列,但是只取其中一个作为合并的标准。

res = pd.merge(df1, df2, on=['a'])
print(res)

输出:

   a b_x b_y   c
0  苏   大   大  da
1  南   叔   苏   哥

左右取不同

默认是取相同名字的列,但是也可以指定不同的名字进行比较。还是取多列相同的这个做例子。

res = pd.merge(df1, df2, left_on='a', right_on='b')
print(res)

这个结果是略显奇怪的,别的例子里面因为作为比较的列都是相同的,所以合并处理了。但是,这个例子里面,作为比较的两个列是不同的名字,所以,两者不但没有合并,而且作为下划线区分。
输出:

    a_x b_x  a_y  b_y  c
0   苏   大   南   苏  哥

当出现这些带附加信息的列名的时候,是使用suffixes参数进行区分的。例如:

res = pd.merge(df1, df2, left_on='a', right_on='b',suffixes=['_left','_right'])
print(res)

输出:

  a_left b_left a_right b_right  c
0      苏      大       南       苏  哥

结语

其余的pandas.merge()的参数,也是属于用不到的,待后续文章描述吧。更多python相关经验文章,请参考:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python