Pandas2.2 DataFrame
Combining comparing joining merging
方法 | 描述 |
---|
DataFrame.assign(**kwargs) | 用于向 DataFrame 添加新列或替换现有列的方法 |
DataFrame.compare(other[, align_axis, …]) | 用于比较两个 DataFrame 的差异的方法 |
DataFrame.join(other[, on, how, lsuffix, …]) | 用于**将两个 DataFrame 按列合并(默认按行索引对齐)**的方法 |
DataFrame.merge(right[, how, on, left_on, …]) | 用于**基于一个或多个键将两个 DataFrame 进行数据库风格的合并(join)**的方法 |
pandas.DataFrame.merge()
pandas.DataFrame.merge()
是 Pandas 中用于**基于一个或多个键将两个 DataFrame 进行数据库风格的合并(join)**的方法。它类似于 SQL 中的 JOIN 操作,支持多种连接方式(如 inner
, left
, right
, outer
),并可以指定左右 DataFrame 的连接键。
📌 方法签名
DataFrame.merge(right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=False,suffixes=('_x', '_y'),copy=None,indicator=False,validate=None
)
🔧 参数说明:
参数 | 说明 |
---|
right | 要合并的另一个 DataFrame |
how | 合并方式,默认 'inner' ,可选 'left' , 'right' , 'outer' |
on | 用于连接的列名(在两个 DataFrame 中都存在) |
left_on | 左边 DataFrame 的连接键(列名或索引) |
right_on | 右边 DataFrame 的连接键(列名或索引) |
left_index | 是否使用左边的索引作为连接键 |
right_index | 是否使用右边的索引作为连接键 |
sort | 是否根据连接键对结果排序,默认 False |
suffixes | 对重复列名添加后缀,默认为 ('_x', '_y') |
copy | 是否复制数据,默认 True ,一般不需修改 |
indicator | 是否添加 _merge 列显示来源,默认 False |
validate | 验证连接类型,如 'one_to_one' , 'one_to_many' 等 |
✅ 返回值
- 返回一个新的 DataFrame,包含两个 DataFrame 根据指定键合并后的数据。
🧪 示例代码及结果
示例 1:内连接(how='inner'
)
import pandas as pddf1 = pd.DataFrame({'key': ['K0', 'K1', 'K2'],'A': ['A0', 'A1', 'A2']
})df2 = pd.DataFrame({'key': ['K0', 'K1', 'K3'],'B': ['B0', 'B1', 'B3']
})
result = df1.merge(df2, on='key')
print(result)
输出:
key A B
0 K0 A0 B0
1 K1 A1 B1
示例 2:左连接(how='left'
)
result = df1.merge(df2, on='key', how='left')
print(result)
输出:
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 NaN
示例 3:右连接(how='right'
)
result = df1.merge(df2, on='key', how='right')
print(result)
输出:
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K3 NaN B3
示例 4:外连接(how='outer'
)
result = df1.merge(df2, on='key', how='outer')
print(result)
输出:
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 NaN
3 K3 NaN B3
示例 5:使用不同列名连接(left_on
, right_on
)
df1 = pd.DataFrame({'id': [1, 2, 3],'name': ['Alice', 'Bob', 'Charlie']
})df2 = pd.DataFrame({'user_id': [1, 2, 4],'score': [90, 85, 70]
})result = df1.merge(df2, left_on='id', right_on='user_id')
print(result)
输出:
id name user_id score
0 1 Alice 1 90
1 2 Bob 2 85
示例 6:使用索引连接(left_index=True
, right_index=True
)
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2']}, index=['K0', 'K1', 'K2'])
df2 = pd.DataFrame({'B': ['B0', 'B1', 'B3']}, index=['K0', 'K1', 'K3'])result = df1.merge(df2, left_index=True, right_index=True)
print(result)
输出:
A B
K0 A0 B0
K1 A1 B1
示例 7:处理列名冲突(suffixes
)
df1 = pd.DataFrame({'key': ['K0', 'K1'], 'value': [1, 2]})
df2 = pd.DataFrame({'key': ['K0', 'K1'], 'value': [3, 4]})result = df1.merge(df2, on='key', suffixes=('_left', '_right'))
print(result)
输出:
key value_left value_right
0 K0 1 3
1 K1 2 4
示例 8:添加来源信息(indicator=True
)
result = df1.merge(df2, on='key', how='outer', indicator=True)
print(result)
输出:
key value_left value_right _merge
0 K0 1.0 3.0 both
1 K1 2.0 4.0 both
🧠 应用场景
场景 | 说明 |
---|
多表关联分析 | 类似 SQL 的 JOIN 操作,进行数据融合 |
特征拼接 | 在机器学习中合并特征与标签 |
补全缺失数据 | 使用另一个 DataFrame 补充当前数据中的缺失字段 |
数据清洗 | 去重、合并、标准化等操作前的数据准备 |
时间序列对齐 | 按时间戳合并多个指标 |
⚠️ 注意事项
merge()
默认是 inner join
;- 若未指定
on
,会自动选择两个 DataFrame 中同名列作为连接键; - 若列名冲突,必须指定
suffixes
; merge()
不支持一次合并多个 DataFrame;- 性能上比
join()
更适合基于列的复杂连接。
✅ 对比 join()
vs merge()
特性 | join() | merge() |
---|
默认连接方式 | 基于索引 | 基于列 |
更适合 | 添加额外列 | 复杂的 SQL 式连接 |
支持多个 DataFrame | ✅ | ❌(只能两表) |
支持 on= | ✅ | ✅ |
支持 suffixes | ✅(lsuffix , rsuffix ) | ✅(suffixes=('_x','_y') ) |
更简洁 | ✅ | ❌ |
你可以根据是否需要基于列进行复杂连接来选择使用 merge()
或 join()
。如果你需要执行类似 SQL 的 JOIN 操作,merge()
是首选方法。