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()
方法合并了 employees 和 departments 这两个 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
:指定要合并的左 DataFrameright
:指定要合并的右 DataFrameon
(可选):指定用于联接的列how
(可选):指定要执行的联接类型left_on
(可选):指定左 DataFrame 中的列,用作合并的键right_on
(可选):指定右 DataFrame 中的列,用作合并的键sort
(可选):如果为True
,则按联接键对结果 DataFrame 进行排序
示例:基于键合并 DataFrame
当两个 DataFrame 之间没有共同列时,我们可以通过在 left_on
和 right_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()
方法对 employees 和 departments 这两个 DataFrame 执行了合并操作。
在这里,我们使用 DeptID1
和 DeptID2
作为合并 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: