Pandas Merge

Pandas 的 merge 操作根据索引或指定的列合并两个 DataFrame。

Pandas 中的 merge() 函数与 SQL 中的 JOIN 操作类似。

让我们看一个例子。

import pandas as pd

# create dataframes from the dictionaries
data1 = {
    'EmployeeID' : ['E001', 'E002', 'E003', 'E004', 'E005'],
    'Name' : ['John Doe', 'Jane Smith', 'Peter Brown', 'Tom Johnson', 'Rita Patel'],
    'DeptID': ['D001', 'D003', 'D001', 'D002', 'D003'],
}
employees = pd.DataFrame(data1)

data2 = {
    'DeptID': ['D001', 'D002', 'D003'],
    'DeptName': ['Sales', 'HR', 'Admin']
}
departments = pd.DataFrame(data2)

# merge dataframes employees and departments merged_df = pd.merge(employees, departments)
# display DataFrames print("Employees:") print(employees) print() print("Departments:") print(departments) print() print("Merged DataFrame:") print(merged_df)

输出

Employees:
  EmployeeID       Name   DeptID
0       E001     John Doe   D001
1       E002   Jane Smith   D003
2       E003  Peter Brown   D001
3       E004  Tom Johnson   D002
4       E005   Rita Patel   D003

Departments:
  DeptID DeptName
0   D001    Sales
1   D002       HR
2   D003    Admin

Merged DataFrame:
  EmployeeID       Name   DeptID DeptName
0       E001     John Doe   D001    Sales
1       E003  Peter Brown   D001    Sales
2       E002   Jane Smith   D003    Admin
3       E005   Rita Patel   D003    Admin
4       E004  Tom Johnson   D002       HR

在本例中,我们使用 merge() 方法合并了 employeesdepartments 这两个 DataFrame。

请注意,这两个 DataFrame 是根据 DeptID 列合并的,因为该列在两个 DataFrame 中都存在。


Pandas 中的 merge() 语法

Pandas 中 merge() 方法的语法是:

pd.merge(left, right, on=None, how='inner', left_on=None, right_on=None, sort=False)

这里,

  • left:指定要合并的左 DataFrame
  • right:指定要合并的右 DataFrame
  • on(可选):指定用于联接的列
  • how(可选):指定要执行的联接类型
  • left_on(可选):指定左 DataFrame 中的列,用作合并的键
  • right_on(可选):指定右 DataFrame 中的列,用作合并的键
  • sort(可选):如果为 True,则按联接键对结果 DataFrame 进行排序

示例:基于键合并 DataFrame

当两个 DataFrame 之间没有共同列时,我们可以通过在 left_onright_on 参数中指定列(作为键)来合并它们。例如:

import pandas as pd

# create dataframes from the dictionaries
data1 = {
    'EmployeeID': ['E001', 'E002', 'E003', 'E004', 'E005'],
    'Name': ['John Doe', 'Jane Smith', 'Peter Brown', 'Tom Johnson', 'Rita Patel'],
    'DeptID1': ['D001', 'D003', 'D001', 'D002', 'D006'],
}
employees = pd.DataFrame(data1)

data2 = {
    'DeptID2': ['D001', 'D002', 'D003', 'D004'],
    'DeptName': ['Sales', 'HR', 'Admin', 'Marketing']
}
departments = pd.DataFrame(data2)

# merge the dataframes df_merge = pd.merge(employees, departments, left_on='DeptID1', right_on = 'DeptID2', sort = True)
print(df_merge)

输出

  EmployeeID       Name   DeptID1 DeptID2 DeptName
0       E001     John Doe    D001    D001    Sales
1       E003  Peter Brown    D001    D001    Sales
2       E004  Tom Johnson    D002    D002       HR
3       E002   Jane Smith    D003    D003    Admin

在上面的示例中,我们使用带有各种参数的 merge() 方法对 employeesdepartments 这两个 DataFrame 执行了合并操作。

在这里,我们使用 DeptID1DeptID2 作为合并 DataFrame 的键。然后,我们使用 sort = True 对结果 DataFrame 进行了排序。


merge() 中的联接操作类型

到目前为止,我们还没有定义如何合并 DataFrame,因此默认情况下它执行的是内连接。

但是,我们可以在 how 参数中指定联接类型。以下是我们在 merge() 方法中可以使用 的 5 种联接类型:

  • 左连接
  • 右连接
  • 外连接
  • 内连接(默认)
  • 交叉连接

左连接

左连接根据共同键合并两个 DataFrame,并返回一个新 DataFrame,该 DataFrame 包含左 DataFrame 中的所有行以及右 DataFrame 中的匹配行。

如果在右 DataFrame 中未找到值,则用 NaN 填充该空格。例如:

import pandas as pd

# create dataframes from the dictionaries
data1 = {
    'EmployeeID': ['E001', 'E002', 'E003', 'E004', 'E005'],
    'Name': ['John Doe', 'Jane Smith', 'Peter Brown', 'Tom Johnson', 'Rita Patel'],
    'DeptID': ['D001', 'D003', 'D001', 'D002', 'D006'],
}
employees = pd.DataFrame(data1)

data2 = {
    'DeptID': ['D001', 'D002', 'D003', 'D004'],
    'DeptName': ['Sales', 'HR', 'Admin', 'Marketing']
}
departments = pd.DataFrame(data2)

# left merge the dataframes df_merge = pd.merge(employees, departments, on = 'DeptID', how = 'left', sort = True)
print(df_merge)

输出

  EmployeeID       Name   DeptID DeptName
0       E001     John Doe   D001   Sales
1       E003  Peter Brown   D001   Sales
2       E004  Tom Johnson   D002      HR
3       E002   Jane Smith   D003   Admin
4       E005   Rita Patel   D006      NaN

右连接

右连接与左连接相反。它返回一个新 DataFrame,该 DataFrame 包含右 DataFrame 中的所有行以及左 DataFrame 中的匹配行。

如果在左 DataFrame 中未找到值,则用 NaN 填充该空格。例如:

import pandas as pd

# create dataframes from the dictionaries
data1 = {
    'EmployeeID': ['E001', 'E002', 'E003', 'E004', 'E005'],
    'Name': ['John Doe', 'Jane Smith', 'Peter Brown', 'Tom Johnson', 'Rita Patel'],
    'DeptID': ['D001', 'D003', 'D001', 'D002', 'D006'],
}
employees = pd.DataFrame(data1)

data2 = {
    'DeptID': ['D001', 'D002', 'D003', 'D004'],
    'DeptName': ['Sales', 'HR', 'Admin', 'Marketing']
}
departments = pd.DataFrame(data2)

# right merge the dataframes df_merge = pd.merge(employees, departments, on = 'DeptID', how = 'right', sort = True)
print(df_merge)

输出

  EmployeeID       Name   DeptID   DeptName
0       E001     John Doe   D001      Sales
1       E003  Peter Brown   D001      Sales
2       E004  Tom Johnson   D002         HR
3       E002   Jane Smith   D003      Admin
4        NaN          NaN   D004  Marketing

内连接

内连接根据共同键合并两个 DataFrame,并返回一个新 DataFrame,该 DataFrame 仅包含在两个原始 DataFrame 中都具有匹配值 的行。

例如,

import pandas as pd

# create dataframes from the dictionaries
data1 = {
    'EmployeeID': ['E001', 'E002', 'E003', 'E004', 'E005'],
    'Name': ['John Doe', 'Jane Smith', 'Peter Brown', 'Tom Johnson', 'Rita Patel'],
    'DeptID': ['D001', 'D003', 'D001', 'D002', 'D006'],
}
employees = pd.DataFrame(data1)

data2 = {
    'DeptID': ['D001', 'D002', 'D003', 'D004'],
    'DeptName': ['Sales', 'HR', 'Admin', 'Marketing']
}
departments = pd.DataFrame(data2)

# inner merge the dataframes df_merge = pd.merge(employees, departments, on = 'DeptID', how = 'inner', sort = True)
print(df_merge)

输出

  EmployeeID     Name     DeptID DeptName
0       E001     John Doe   D001    Sales
1       E003  Peter Brown   D001    Sales
2       E004  Tom Johnson   D002       HR
3       E002   Jane Smith   D003    Admin

外连接

外连接根据共同键合并两个 DataFrame。与内连接不同,外连接返回一个新 DataFrame,该 DataFrame 包含两个原始 DataFrame 中的所有行。

如果在 DataFrame 中未找到值,则用 NaN 填充该空格。

例如,

import pandas as pd

# create dataframes from the dictionaries
data1 = {
    'EmployeeID': ['E001', 'E002', 'E003', 'E004', 'E005'],
    'Name': ['John Doe', 'Jane Smith', 'Peter Brown', 'Tom Johnson', 'Rita Patel'],
    'DeptID': ['D001', 'D003', 'D001', 'D002', 'D006'],
}
employees = pd.DataFrame(data1)

data2 = {
    'DeptID': ['D001', 'D002', 'D003', 'D004'],
    'DeptName': ['Sales', 'HR', 'Admin', 'Marketing']
}
departments = pd.DataFrame(data2)

# outer merge the dataframes df_merge = pd.merge(employees, departments, on = 'DeptID', how = 'outer', sort = True)
print(df_merge)

输出

  EmployeeID       Name   DeptID   DeptName
0       E001     John Doe   D001      Sales
1       E003  Peter Brown   D001      Sales
2       E004  Tom Johnson   D002         HR
3       E002   Jane Smith   D003      Admin
4        NaN          NaN   D004  Marketing
5       E005   Rita Patel   D006        NaN

交叉连接

Pandas 中的交叉连接会创建两个 DataFrame 的笛卡尔积,同时保留左 DataFrame 的顺序。

例如,

import pandas as pd

# create dataframes from the dictionaries
data1 = {
    'EmployeeID': ['E001', 'E002', 'E003', 'E004', 'E005'],
    'Name': ['John Doe', 'Jane Smith', 'Peter Brown', 'Tom Johnson', 'Rita Patel'],
    'DeptID': ['D001', 'D003', 'D001', 'D002', 'D006'],
}
employees = pd.DataFrame(data1)

data2 = {
    'DeptID': ['D001', 'D002', 'D003', 'D004'],
    'DeptName': ['Sales', 'HR', 'Admin', 'Marketing']
}
departments = pd.DataFrame(data2)

# merge the dataframes df_merge = pd.merge(employees, departments, how = 'cross')
print(df_merge)

输出

     EmployeeID      Name    DeptID_x DeptID_y   DeptName
0        E001     John Doe     D001     D001      Sales
1        E001     John Doe     D001     D002         HR
2        E001     John Doe     D001     D003      Admin
3        E001     John Doe     D001     D004  Marketing
4        E002   Jane Smith     D003     D001      Sales
5        E002   Jane Smith     D003     D002         HR
6        E002   Jane Smith     D003     D003      Admin
7        E002   Jane Smith     D003     D004  Marketing
8        E003  Peter Brown     D001     D001      Sales
9        E003  Peter Brown     D001     D002         HR
10       E003  Peter Brown     D001     D003      Admin
11       E003  Peter Brown     D001     D004  Marketing
12       E004  Tom Johnson     D002     D001      Sales
13       E004  Tom Johnson     D002     D002         HR
14       E004  Tom Johnson     D002     D003      Admin
15       E004  Tom Johnson     D002     D004  Marketing
16       E005   Rita Patel     D006     D001      Sales
17       E005   Rita Patel     D006     D002         HR
18       E005   Rita Patel     D006     D003      Admin
19       E005   Rita Patel     D006     D004  Marketing

Join vs Merge vs Concat

Pandas 中有三种不同的方法可以合并 DataFrame:

  • join():根据索引合并两个 DataFrame,默认执行左连接。
  • merge():根据指定的任何列合并两个 DataFrame,默认执行内连接。
  • concat():沿垂直或水平轴堆叠两个 DataFrame。

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战