python编程,解读pandas.merge()合并dataframe的on标准
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
继续讨论pandas.merge()
函数,本文讨论其中的on
、left_on
和right_on
三个参数,对应到sql
语言里面,就是两者进行连接的on
标准的选择问题。默认的on
,必然是两者都有的某个列,比如id
。但是,它是可以改变的。
大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码之间的故事。测试环境:python@3.6.8
,pandas@1.1.5
,numpy@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 南 苏 哥
res = pd.merge(df1, df2)
print(res)
res = pd.merge(df1, df2, on=['a','b'])
print(res)
输出都是:
a b c
0 苏 大 da
以a
和b
相同列做一个单位,求合集。
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
相关经验文章,请参考:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。