python编程,解读pandas.merge()合并dataframe的join方式
发布于 作者:苏南大叔 来源:程序如此灵动~本文讲述由pandas
提供的两个dataframe
对象合并merge
的操作,当然因为series
作为dataframe
的子对象,也是属于被pandas.merge()
的操作范围。
大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码之间的故事。测试环境:python@3.6.8
,pandas@1.1.5
,numpy@1.24.4
。
前文回顾
pandas
除了本文的.merge()
操作,还提供了.concat()
操作,具体请参考:
本文所描述的pandas.merge()
具有和数据库类似的inner join
、outer join
、left join
、right join
的特性,所以,可以参考:
函数原型
python
里面的pands.merge()
函数原型:
pandas.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)
参数说明:
参数 | 默认 | 说明 |
---|---|---|
left、right | 要合并的DataFrame对象 | |
how | inner | 合并方式,可以是 'inner'(默认)、'outer'、'left' 或 'right' |
on | 用于连接的列名,必须在两个DataFrame对象中都存在 | |
left_on、right_on | 分别指定 left 和 right 的连接列 | |
left_index 和、right_index | 如果为True,则使用左边或右边的行索引作为连接键 | |
sort | False | 合并后的数据按照连接键进行排序,改成True可能会增加开销 |
suffixes | 字符串元组,指定当左右DataFrame存在相同列名时,如何命名这些列 | |
copy | True | 始终从传递的DataFrame对象复制数据(默认为True),即使不需要重建索引也是如此 |
indicator | 显示合并来源的信息 |
基础样本
import pandas as pd
df1 = pd.DataFrame({'a':['苏','南'],'b':['大','叔']})
df2 = pd.DataFrame({'a':['苏','su','南'],'c':['da','shu','哥']})
print(df1)
print(df2)
输出:
a b
0 苏 大
1 南 叔
a c
0 苏 da
1 su shu
2 南 哥
默认inner join【交集】
inner join
就是取left
和right
的交集。
res = pd.merge(df1, df2)
print(res)
输出:
a b c
0 苏 大 da
1 南 叔 哥
这个就是left
和right
,使用了共同的列a
进行默认的inner join
得出的结果,求的是两者的交集。
how='outer'【合集】
res = pd.merge(df1, df2, how='outer')
print(res)
输出:
a b c
0 苏 大 da
1 南 叔 哥
2 su NaN shu
注意,这里出现了一个空值NaN
。
how='left'【左连接】左边独有+交集
res = pd.merge(df1, df2, how='left')
print(res)
输出:
a b c
0 苏 大 da
1 南 叔 哥
how='right'【右连接】右边独有+交集
res = pd.merge(df1, df2, how='right')
print(res)
输出:
a b c
0 苏 大 da
1 su NaN shu
2 南 叔 哥
注意,这里也出现了一个缺失值NaN
。
indicator解释
对于这个join
方式,理解其结果确实有些难度。但是这个函数官方出了一个参数indicator
用于解释结果。虽然计算的时候可能用不到,但是人工理解数据结果还是挺好用的。
将一列添加到名为_merge
的输出DataFrame
,其中包含有关每行源的信息。_merge
是分类类型,并且对于其合并键仅出现在左DataFrame
中的观察值,取得值为left_only
,对于其合并键仅出现在右DataFrame
中的观察值为right_only
,并且如果在两者中都找到观察点的合并键,则为both
。
比如:
res = pd.merge(df1, df2, how='right', indicator=True)
print(res)
输出:
a b c _merge
0 苏 大 da both
1 su NaN shu right_only
2 南 叔 哥 both
总结
因为这个函数的参数太多了,而且参数之间存在相互影响的关系。这里就先结合原有的内外链接,左右链接的概念,说一下left
、right
、how
三个参数。后续的文章再讨论剩下的参数的使用。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。