merge不同情况

310 阅读4分钟

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 = 2A = 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 = 1df2 中没有匹配,因此对应的 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 = 4df1 中没有匹配,因此对应的 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' 选项,但可以通过 mergeindicator 配合实现笛卡尔积。

示例:
# 创建示例 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
  • 解释:这里使用了 AB 作为连接键,只有 A=2B=YA=3B=Z 的行在两个 DataFrame 中都有,其他的被排除。

7. 合并时有不同列名的情况

当两个 DataFrame 中有相同但不同的列名时,你可以使用 left_onright_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 的列 Adf2 的列 B 被作为合并的依据。

总结

  • 内连接:只保留两个 DataFrame 中都有的匹配行。
  • 左连接:保留左边 DataFrame 中的所有行,并从右边添加匹配的行。
  • 右连接:保留右边 DataFrame 中的所有行,并从左边添加匹配的行。
  • 外连接:保留两个 DataFrame 中的所有行,没匹配的填充 NaN
  • 笛卡尔积(Cross Join) :将两个 DataFrame 中的每一行进行组合,生成所有可能的配对。
  • 多个连接键:可以指定多个列作为连接的键。
  • 不同列名的合并:使用 left_onright_on 指定不同的连接列。

merge() 是一个非常灵活且强大的函数,可以处理各种复杂的数据连接场景,适用于 SQL 样式的多表连接操作。