pandas中的数据合并[join和merge]

merge

merge()函数是用来合并两个DataFrame对象,可以根据一个或多个共同的进行合并。
语法:

pd1.merge(pd2, how='inner', on=None, 
			left_on=None, right_on=None)
  • 参数解释
  • on: 用来指定需要进行匹配的列。如果两边的列名不同(没有可匹配的列),可以使用left_on和right_on来分别指定左侧和右侧的列.
  • left_on 和 right_on:分别指定左侧和右侧 DataFrame 中的列名,用来进行连接。如果这两个参数同时提供,Pandas 将按照这两个列进行合并。
  • how: 合并的方式,支持以下几种类型:
    inner:默认值,返回在两个DataFrame中都有的行(交集)。
    outer:返回两个DataFrame的并集,缺失的值会用NaN填充
    left:以左侧DataFrame的为主,右侧DataFrame没有的值用NaN填充。
    right:以右侧DataFrame为主,左侧DataFrame没有的值用NaN填充。
    用一个不太恰当的比喻来解释连接:
    把内连接比喻成男主内女主内,把连接当做对话(相同列),当小两口都不出去工作,见识比较少,男女交流时必须说大家都了解的话题(A,B,C,D)彼此才会认同。
    把外连接比喻成男主外女主外,当男女都出去工作,男人说的话题女生能听懂,就算女生听不懂(NaN)也会认同,女生说的话题男生也能听懂,就算男生听不懂(NaN)也会认同。
    把左连接比喻成男主外女主内,当只有男生出去工作时,男人说的话女生会认同,就算女生听不懂(NaN)也得认同
    把右连接比喻成男主内女主外,当只有女生出去工作时,女生说的话女生会认同,就算男生听不懂(NaN)也得认同

举例说明:

  1. 内连接(inner): 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行【男主内女主内】
import pandas as pd
import pandas as pd
# 创建示例 DataFrame
df1 = pd.DataFrame({
    'key': ['A', 'B', 'C', 'D'],
    'value1': [1, 2, 3, 4]
})
df2 = pd.DataFrame({
    'key': ['B', 'D', 'E', 'F'],
    'value2': [5, 6, 7, 8]
})
# 内连接
result = pd.merge(df1, df2, on='key', how='inner')
print(df1)
print(df2)
print(result)

生成两个DataFrame,分别是df1和df2

  key  value1
0   A       1
1   B       2
2   C       3
3   D       4
  key  value2
0   B       5
1   D       6
2   E       7
3   F       8
  key  value1  value2
0   B       2       5
1   D       4       6

在这里插入图片描述
2. 外连接(outer)
外连接返回两个 DataFrame 中所有的键,缺少的部分用 NaN 填充,[男主外女主外]。

result = pd.merge(df1, df2, on='key', how='outer')

在这里插入图片描述
3. 左连接(left)
左连接返回左侧 DataFrame 中所有的键,如果右侧没有匹配的键,则用 NaN 填充。【男主外女主内】

result = pd.merge(df1, df2, on='key', how='left')

在这里插入图片描述
4. 右连接(right)
右连接返回右侧 DataFrame 中所有的键,如果左侧没有匹配的键,则用 NaN 填充。【女主外男主内】

result = pd.merge(df1, df2, on='key', how='right')

在这里插入图片描述
5. 通常,如果左右两个DataFrame有相同的列名可以直接使用on参数,但如果左右DataFrame中要合并的列名不同,则可以分别使用 left_onright_on 参数。

import pandas as pd
# 创建示例 DataFrame
df1 = pd.DataFrame({
    'left_key': ['A', 'B', 'C', 'D'],
    'value1': [1, 2, 3, 4]
})
df2 = pd.DataFrame({
    'right_key': ['B', 'D', 'E', 'F'],
    'value2': [5, 6, 7, 8]
})
# 使用 left_on 和 right_on 进行合并
result = pd.merge(df1, df2, left_on='left_key', right_on='right_key', how='inner')
print(df1)
print(df2)
print(result)

在这里插入图片描述
在内连接中使用
起其实就是没有相同名的列或者内容上是相同列只是命名不同,需要我们来把他俩指定出来。

# 使用 left_on 和 right_on 进行合并
result = pd.merge(df1, df2, left_on='left_key',
 right_on='right_key', how='inner')

合并的结果是只保留两个 DataFrame 中 left_key 和 right_key相同的行(即 ‘B’ 和 ‘D’),内连接思想没有变化。
在外连接中的使用

result = pd.merge(df1, df2, left_on='left_key',
 right_on='right_key', how='outer')

在这里插入图片描述

join

join默认情况下行行索引相同的数据合并到一起(类似于交集)
在这里插入图片描述

总结

merge() 适用于更复杂的合并需求,特别是当需要基于不同的列或多个列进行合并时,merge() 提供了更多的灵活性。
join() 适用于较为简单的基于行标签的合并操作,特别是当需要将多个 DataFrame 基于行标签对齐时,join() 可以简化操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

右拐三次就是左

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值