pandas.merge() 是用于合并 DataFrame 的一种非常强大的工具,可以通过不同的方式对数据进行连接。它类似于 SQL 中的 JOIN 操作,允许你基于一个或多个键(列)来合并数据。merge() 支持多种合并方式,包括内连接、外连接、左连接、右连接,以及更特殊的合并方式,如笛卡尔积等。
merge() 的常见情况
1. 内连接(inner)
内连接是默认的合并方式,只保留在两个 DataFrame 中都有的键值对(交集)。
示例:
import pandas as pd
# 创建示例 DataFrame
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': ['X', 'Y', 'Z']})
df2 = pd.DataFrame({'A': [2, 3, 4], 'C': ['P', 'Q', 'R']})
# 内连接
result = pd.merge(df1, df2, on='A', how='inner')
print(result)
输出:
A B C
0 2 Y P
1 3 Z Q
- 解释:内连接只返回
A列在两个DataFrame中都存在的行。这里,A = 2和A = 3是两个DataFrame中的交集。
2. 左连接(left)
左连接保留左边 DataFrame 中所有的行,并根据匹配的键从右边的 DataFrame 中添加数据。如果右边没有匹配的行,则填充 NaN。
示例:
# 左连接
result = pd.merge(df1, df2, on='A', how='left')
print(result)
输出:
A B C
0 1 X NaN
1 2 Y P
2 3 Z Q
- 解释:左连接返回左边
df1中的所有行,右边df2中的匹配行(如果有)。A = 1在df2中没有匹配,因此对应的C列为NaN。
3. 右连接(right)
右连接与左连接相反,保留右边 DataFrame 中所有的行,并根据匹配的键从左边的 DataFrame 中添加数据。如果左边没有匹配的行,则填充 NaN。
示例:
# 右连接
result = pd.merge(df1, df2, on='A', how='right')
print(result)
输出:
A B C
0 2 Y P
1 3 Z Q
2 4 NaN R
- 解释:右连接返回右边
df2中的所有行,左边df1中的匹配行(如果有)。A = 4在df1中没有匹配,因此对应的B列为NaN。
4. 外连接(outer)
外连接保留两个 DataFrame 中所有的行,任何一边没有匹配的值都会填充为 NaN。
示例:
# 外连接
result = pd.merge(df1, df2, on='A', how='outer')
print(result)
输出:
A B C
0 1 X NaN
1 2 Y P
2 3 Z Q
3 4 NaN R
- 解释:外连接保留了两个
DataFrame中所有的行,对于没有匹配的值,NaN会被填充。
5. 笛卡尔积(Cross Join)
笛卡尔积(即 cross join)是将两个 DataFrame 中的所有行进行组合。merge 方法本身没有直接的 how='cross' 选项,但可以通过 merge 和 indicator 配合实现笛卡尔积。
示例:
# 创建示例 DataFrame
df1 = pd.DataFrame({'A': [1, 2]})
df2 = pd.DataFrame({'B': ['X', 'Y', 'Z']})
# 笛卡尔积:用 `merge` 和空键进行连接
result = pd.merge(df1, df2, how='cross')
print(result)
输出:
A B
0 1 X
1 1 Y
2 1 Z
3 2 X
4 2 Y
5 2 Z
- 解释:笛卡尔积会将左边
df1中的每一行与右边df2中的每一行组合,形成所有可能的组合。
6. 多个键的合并
在 merge() 中,你可以指定多个列作为连接键。多个键的合并类似于 SQL 中的多条件 JOIN。
示例:
# 创建示例 DataFrame
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': ['X', 'Y', 'Z'], 'C': [10, 20, 30]})
df2 = pd.DataFrame({'A': [2, 3, 4], 'B': ['Y', 'Z', 'W'], 'D': ['P', 'Q', 'R']})
# 使用多个键进行合并
result = pd.merge(df1, df2, on=['A', 'B'], how='inner')
print(result)
输出:
A B C D
0 2 Y 20 P
1 3 Z 30 Q
- 解释:这里使用了
A和B作为连接键,只有A=2且B=Y和A=3且B=Z的行在两个DataFrame中都有,其他的被排除。
7. 合并时有不同列名的情况
当两个 DataFrame 中有相同但不同的列名时,你可以使用 left_on 和 right_on 来指定合并的列。
示例:
# 创建示例 DataFrame
df1 = pd.DataFrame({'A': [1, 2, 3], 'X': ['A', 'B', 'C']})
df2 = pd.DataFrame({'B': [2, 3, 4], 'Y': ['P', 'Q', 'R']})
# 使用 left_on 和 right_on 合并
result = pd.merge(df1, df2, left_on='A', right_on='B', how='inner')
print(result)
输出:
A X B Y
0 2 B 2 P
1 3 C 3 Q
- 解释:这里
df1的列A和df2的列B被作为合并的依据。
总结
- 内连接:只保留两个
DataFrame中都有的匹配行。 - 左连接:保留左边
DataFrame中的所有行,并从右边添加匹配的行。 - 右连接:保留右边
DataFrame中的所有行,并从左边添加匹配的行。 - 外连接:保留两个
DataFrame中的所有行,没匹配的填充NaN。 - 笛卡尔积(Cross Join) :将两个
DataFrame中的每一行进行组合,生成所有可能的配对。 - 多个连接键:可以指定多个列作为连接的键。
- 不同列名的合并:使用
left_on和right_on指定不同的连接列。
merge() 是一个非常灵活且强大的函数,可以处理各种复杂的数据连接场景,适用于 SQL 样式的多表连接操作。