目录
一、简介
pd.merge() 是 Pandas 库中用于合并数据表的强大函数。它类似于 SQL 中的 JOIN 操作,可以根据一个或多个键将两个或多个 DataFrame 合并在一起。
备注:只能进行纵向拼接。
二、基本用法和参数说明
pd.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: 左侧 DataFrame。
right: 右侧 DataFrame。
how: 合并类型,默认为 'inner'。其他选项包括 'left', 'right', 'outer'。
on: 用于连接的列名。如果未指定,并且没有指定 left_on 和 right_on,则使用 left 和 right 中共同列名的交集。
left_on: 左 DataFrame 中的列或索引级别名称用作键。
right_on: 右 DataFrame 中的列或索引级别名称用作键。
left_index: 如果为 True,则使用左侧 DataFrame 的索引(行标签)作为其合并键。
right_index: 如果为 True,则使用右侧 DataFrame 的索引(行标签)作为其合并键。
sort: 根据合并键对合并后的数据进行排序,默认为 False。
suffixes: 用于追加到重叠列名末尾的字符串元组,默认为 ('_x', '_y')。
copy: 如果为 False,则不复制数据(在可能的情况下),默认为 True。
indicator: 如果为 True,则添加一个特殊列 '_merge' 到输出 DataFrame,表明每行的来源:'left_only', 'right_only', 'both'。
validate: 检查合并键是否在左右 DataFrame 中都存在,以及合并类型是否有效。可选值包括 'one_to_one', 'one_to_many', 'many_to_one', 'many_to_many', 'exact'。
三、示例代码(两个Dataframe合并)
1、外连接(how = 'outer')
外连接保留两个数据集中所有的记录,并且对于没有匹配的部分用 NaN 填充。
import pandas as pd
df1 = pd.DataFrame({
'Name': ['A', 'B', 'C'],
'Age': [25, 30, 35]
})
df2 = pd.DataFrame({
'Name': ['A', 'D', 'C'],
'Gender': ['男生', '男生', '女生']
})
merged_df_outer = pd.merge(df1, df2, on='Name', how='outer')
print(merged_df_outer)
# 运行结果
Name Age Gender
0 A 25.0 男生
1 B 30.0 NaN
2 C 35.0 女生
3 D NaN 男生
2、内连接(how='inner')
内连接只保留两个数据集中键匹配的记录。
mport pandas as pd
df1 = pd.DataFrame({
'Name': ['A', 'B', 'C'],
'Age': [25, 30, 35]
})
df2 = pd.DataFrame({
'Name': ['A', 'D', 'C'],
'Gender': ['男生', '男生', '女生']
})
merged_df_inner = pd.merge(df1, df2, on='Name', how='inner')
print(merged_df_inner)
# 运行结果
Name Age Gender
0 A 25 男生
1 C 35 女生
3、左连接(how='left')
左连接保留左侧数据集的所有记录,右侧数据集中无匹配的则返回空值。
import pandas as pd
df1 = pd.DataFrame({
'Name': ['A', 'B', 'C'],
'Age': [25, 30, 35]
})
df2 = pd.DataFrame({
'Name': ['A', 'D', 'C'],
'Gender': ['男生', '男生', '女生']
})
# 返回左侧 DataFrame 的所有行,如果右侧 DataFrame 中没有匹配的行,
# 则结果中右侧 DataFrame 的列填充 NaN。
merged_df_left = pd.merge(df1, df2, on='Name', how='left')
print(merged_df_left)
# 运行结果
Name Age Gender
0 A 25 男生
1 B 30 NaN
2 C 35 女生
4、右连接(how='right')
右连接与左连接相反,保留右侧数据集的所有记录。
import pandas as pd
df1 = pd.DataFrame({
'Name': ['A', 'B', 'C'],
'Age': [25, 30, 35]
})
df2 = pd.DataFrame({
'Name': ['A', 'D', 'C'],
'Gender': ['男生', '男生', '女生']
})
# 'right': 右连接,返回右侧 DataFrame 的所有行,如果左侧 DataFrame 中没有匹配的行,则结果中左侧 DataFrame 的列填充 NaN。
merged_df_right = pd.merge(df1, df2, on='Name', how='right')
print(merged_df_right)
# 运行结果
Name Age Gender
0 A 25.0 男生
1 D NaN 男生
2 C 35.0 女生
四、示例代码(多个Dataframe合并)
from functools import reduce
import pandas as pd
df1 = pd.DataFrame({
'Name': ['A', 'B', 'C'],
'Age': [25, 30, 35]
})
df2 = pd.DataFrame({
'Name': ['A', 'D', 'C'],
'Gender': ['男生', '男生', '女生']
})
df3 = pd.DataFrame({
'Name': ['A', 'E', 'C'],
'province': ['上海', '北京', '湖南']
})
dfs = [df1, df2, df3]
result = reduce(lambda left, right: pd.merge(left, right, on='Name', how='outer'), dfs)
print(result)
# 运行结果
Name Age Gender province
0 A 25.0 男生 上海
1 B 30.0 NaN NaN
2 C 35.0 女生 湖南
3 D NaN 男生 NaN
4 E NaN NaN 北京