在数据分析的征途中,我们经常面临这样一个挑战:数据分散在不同的表格或文件中。为了获得全面的洞察,我们需要将这些分散的信息“粘”在一起。这就是 Pandas 中 merge() 函数大显身手的地方。它类似于 SQL 中的 JOIN 语句,允许我们基于共同的键将两个 DataFrame 连接起来。
在这篇文章中,我们将深入探讨如何使用 merge() 函数来连接两个 Pandas DataFrame。我们将通过解释关键概念、参数细节和丰富的实际示例,带你从基础用法走向高级应用,确保你能够自信地处理任何数据合并的场景。
!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20241112150305125231/joiningtwopandasdataframesusingmerge.webp">joiningtwopandasdataframesusingmerge
图示:使用 merge() 连接两个 Pandas DataFrame 的概念演示
为什么数据合并如此重要?
想象一下,你手头有两张表:一张包含用户的基本信息(如 ID、姓名),另一张包含用户的交易详情(如 ID、购买金额、日期)。在实际分析中,我们往往需要知道“Emily 购买了多少钱”,而不是只知道 ID 为 1 的用户购买了多少钱。这就要求我们将这两张表根据 ID 这一“公共列”无缝地拼接在一起。
merge() 的核心思想就是利用这些重叠的列(或者索引)来对齐数据。让我们首先通过一个简单的例子来感受一下它的魔力。
基础示例:连接两个 DataFrame
如果两个表中有列名相同的列(我们称之为“键”),合并过程将非常直观。我们只需要使用 on 参数来指定这个列名即可。
例如:
import pandas as pd
# 定义第一个 DataFrame:包含 ID 和 Name
df1 = pd.DataFrame({
‘ID‘: [1, 2, 3],
‘Name‘: [‘Emily‘, ‘Jack‘, ‘Jennifer‘]
})
# 定义第二个 DataFrame:包含 ID 和 Age
df2 = pd.DataFrame({
‘ID‘: [1, 2, 4],
‘Age‘: [24, 27, 22]
})
# 使用 ‘ID‘ 列进行内连接
# how=‘inner‘ 表示只保留两个表中都存在的 ID
res = pd.merge(df1, df2, on=‘ID‘, how=‘inner‘)
print("合并后的结果:")
print(res)
输出:
ID Name Age
0 1 Emily 24
1 2 Jack 27
发生了什么?
你可能注意到了,原始数据中有 ID 为 3(Jennifer)和 ID 为 4(Age 22)的数据,但结果中并没有出现。这是因为我们使用了内连接(Inner Join,这也是默认设置)。Pandas 寻找两个表中 ID 列的交集,只保留了在两个表中同时存在的行(ID 1 和 2)。
—
Pandas 中的 merge() 函数详解
在深入复杂的连接类型之前,让我们先拆解一下 merge() 函数的语法和参数,理解它们是如何工作的。
#### 语法结构
pd.merge() 的基本调用方式如下:
pd.merge(left, right, how=‘inner‘, on=None, left_on=None, right_on=None, ...)
#### 核心参数解析
为了让你能够精确控制合并行为,以下是几个最关键的参数:
-
left: 参与合并的第一个 DataFrame(左侧表)。 -
right: 参与合并的第二个 DataFrame(右侧表)。 - INLINECODEf5ca63fe: 决定连接类型的字符串。这是最重要的参数之一,决定了保留哪些行。可选值有 INLINECODE209655e1, INLINECODEa6f491f0, INLINECODE1db8691e, INLINECODEb87c439a。默认是 INLINECODE5f230d58。
-
on: 用于连接的列名(即“键”)。如果两个表中该列名完全相同,使用这个参数最方便。 - INLINECODE7de1ffeb 和 INLINECODE4dfb702e: 当两个表中的键列名不一样时使用。例如,左表叫 INLINECODEf191dd92,右表叫 INLINECODE1ec07c51。
深入探讨连接的类型
理解不同的连接方式是掌握 merge 的关键。我们将通过一个关于水果市场的实际案例来演示每一种连接方式。
首先,让我们创建两个示例 DataFrame:
import pandas as pd
# 市场 1 的数据:水果和市场价格
df1 = pd.DataFrame({
"fruit": ["apple", "banana", "avocado", "cherry"],
"market_price": [21, 14, 35, 18]
})
print("=== 左侧表
# 市场 2 的数据:水果和批发价格
df2 = pd.DataFrame({
"fruit": ["banana", "apple", "avocado", "date"],
"wholesaler_price": [65, 68, 75, 50]
})
print("
=== 右侧表
#### 1. 内连接 – 交集
定义: 仅保留两个 DataFrame 中在指定列上有匹配值的行。如果没有匹配,该行会被丢弃。这是最严格的连接方式。
# 执行内连接
inner_merge = pd.merge(df1, df2, on="fruit", how="inner")
print("
=== 内连接结果 ===")
print(inner_merge)
结果分析:
你可以看到,只有 "apple", "banana" 和 "avocado" 出现在结果中。因为 "cherry" 只在 df1 存在,"date" 只在 df2 存在,它们都被过滤掉了。
`INLINECODE973d26c4`INLINECODEd062cd46intINLINECODEb43e0e11strINLINECODE8651b7cbdf.dtypesINLINECODEba094be7df.query()INLINECODEcb61ddaeshapeINLINECODE325f9998merge()INLINECODE73f70ed4leftonINLINECODEe774c796rightonINLINECODE6b3e1f3ehowINLINECODEd30b8185NaNINLINECODE375f1654fillna()INLINECODE2db5beb1dropna()INLINECODE5381a811suffixes 来区分它们的来源。
掌握了 merge()`,你就掌握了整合复杂数据集的能力。当你下次面对零散的数据表格时,不妨试着运用这些技巧,让数据流动起来,讲述完整的故事。继续练习,你会发现数据合并其实是一门非常有趣的艺术!