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)也得认同
举例说明:
内连接(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_on
和 right_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() 可以简化操作