使用merge()连接两个Pandas DataFrames

  • Post category:Python

连接两个 Pandas DataFrame 可以使用 merge() 方法, merge() 方法可用于连接两个 DataFrame 的行或列,也可以根据指定的一列或多列进行连接。下面详细讲解如何使用 merge() 连接两个 Pandas DataFrames。

准备工作

首先,导入 Pandas 库,构造两个 DataFrame 并赋值。

import pandas as pd

# 构造第一个 DataFrame
df1 = pd.DataFrame({
    'id': [1, 2, 3, 4, 5],
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve']
})

# 构造第二个 DataFrame
df2 = pd.DataFrame({
    'id': [1, 2, 3, 5, 6],
    'age': [20, 22, 25, 18, 30]
})

生成的 df1 和 df2 分别如下:

id name
0 1 Alice
1 2 Bob
2 3 Charlie
3 4 David
4 5 Eve
id age
0 1 20
1 2 22
2 3 25
3 5 18
4 6 30

按照指定列连接两个 DataFrame

假如我们按照 “id” 列连接这两个 DataFrame, merge() 方法的使用如下:

# 按照 "id" 列连接两个 DataFrame
df3 = pd.merge(df1, df2, on='id')

# 显示连接结果
print(df3)

输出结果:

id name age
0 1 Alice 20
1 2 Bob 22
2 3 Charlie 25
3 5 Eve 18

说明:merge() 方法的出入口参数必须是 DataFrame 对象,其中 on 属性指定连接列的名称,列名相同时可以省略 on 属性,merge() 工作方式为“inner”,findAll Column Name匹配时进行连接。

连接方式

merge() 方法有四个参数控制连接方式:how、left_on、right_on、suffixes。

  • how:连接方式,取值为 [‘inner’, ‘left’, ‘right’, ‘outer’],默认值为’inner’。
  • ‘inner’:内连接,只连接两个 DataFrame 中连接的行。
  • ‘left’:左连接,保留左边 DataFrame 的所有行,并将两个 DataFrame 进行连接。
  • ‘right’:右连接,保留右边 DataFrame 的所有行,并将两个 DataFrame 进行连接。
  • ‘outer’:外连接,保留两个 DataFrame 的所有行,并将它们进行连接。

  • left_on:左边 DataFrame 的连接列名称。

  • right_on:右边 DataFrame 的连接列名称。

  • suffixes:连接列名冲突时使用的后缀,类型为 tuple,并且长度为 2,分别表示左边 DataFrame 和右边 DataFrame 的连接列的后缀。

指定连接方式

假设我们使用外连接,代码如下:

df4 = pd.merge(df1, df2, on='id', how='outer')

# 显示连接结果
print(df4)

输出结果:

id name age
0 1 Alice 20
1 2 Bob 22
2 3 Charlie 25
3 4 David NaN
4 5 Eve 18
5 6 NaN 30

说明:outer 连接返回了两个 DataFrame 的全部行,当存在“缺失”的时候,NaN 填充。

指定连接列名称

同时,上面两个 DataFrame 的连接列名称都是 “id”,如果不一样,要使用 left_on 和 right_on 来指定连接列名称。假设我们现在将 “df2” 中的 “id” 列改成 “person_id”,代码如下:

# 构造第二个 DataFrame
df2_new = pd.DataFrame({
    'person_id': [1, 2, 3, 5, 6],
    'age': [20, 22, 25, 18, 30]
})

# 按照 'person_id' 列连接两个 DataFrame
df5 = pd.merge(df1, df2_new, left_on='id', right_on='person_id')

# 显示连接结果
print(df5)

输出结果:

id name person_id age
0 1 Alice 1 20
1 2 Bob 2 22
2 3 Charlie 3 25
3 5 Eve 5 18

说明:df1 的 “id” 与 df2_new 的 “person_id” 列进行了连接。

解决列名冲突问题

最后,我们来解决一下连接列名冲突的问题。如果两个 DataFrame 中连接列的名称不一样,那么就会出现列名冲突的情况。最好的解决方法是将两个连接列名称都改成一样的。如果两个连接列名称不同,可以使用 suffixes 属性来指定连接列名冲突时使用的后缀。

# 构造第二个 DataFrame
df2_new2 = pd.DataFrame({
    'person_id': [1, 2, 3, 5, 6],
    'age': [20, 22, 25, 18, 30]
})

# 按照 'person_id' 列连接两个 DataFrame
df6 = pd.merge(df1, df2_new2, left_on='id', right_on='person_id', suffixes=('_left', '_right'))

# 显示连接结果
print(df6)

输出结果:

id name person_id age_left age_right
0 1 Alice 1 20 20
1 2 Bob 2 22 22
2 3 Charlie 3 25 25
3 5 Eve 5 18 18

说明:suffixes 参数指定连接列名冲突时使用的后缀,_left 和 _right 分别指定左边 DataFrame 和右边 DataFrame 的连接列的后缀。

以上就是使用 merge() 方法连接两个 Pandas DataFrame 的完整攻略,通过上面的介绍,各位同学应该可以熟练掌握 merge() 方法的使用了。