在上一集中,我们学习了基本的数据合并与连接。今天,我们将深入学习多表连接、连接条件的设置和索引对齐。
多表连接概述
多表连接是数据分析中的一项高级技能,它允许我们将多个数据表合并成一个统一的数据集,以便进行更复杂的分析。
多表连接
python代码
import pandas as pd
# 创建示例数据集
df1 = pd.DataFrame({
'Key1': ['A', 'B', 'C', 'D'],
'Value1': [1, 2, 3, 4]
})
df2 = pd.DataFrame({
'Key2': ['B', 'D', 'E', 'F'],
'Value2': [5, 6, 7, 8]
})
df3 = pd.DataFrame({
'Key3': ['C', 'D'],
'Value3': [9, 10]
})
# 多表连接
merged_df = pd.merge(df1, df2, on='Key1', how='inner')
merged_df = pd.merge(merged_df, df3, on='Key3', how='inner')
print(merged_df)
连接条件的设置
python代码
# 设置复杂的连接条件
df1 = pd.DataFrame({
'ID': [1, 2, 3],
'Name': ['Alice', 'Bob', 'Charlie']
})
df2 = pd.DataFrame({
'ID': [2, 2, 4],
'Score': [90, 85, 95]
})
# 连接条件:ID 相等且 Score 大于 90
merged_df = pd.merge(df1, df2, left_on='ID', right_on='ID', how='inner', suffixes=('_left', '_right'))
merged_df = merged_df[merged_df['Score_right'] > 90]
print(merged_df)
索引对齐
python代码
# 使用join()方法进行索引对齐
df1 = pd.DataFrame({
'Value1': [1, 2, 3],
'ID': [1, 2, 3]
}).set_index('ID')
df2 = pd.DataFrame({
'Value2': [4, 5, 6],
'ID': [1, 2, 3]
}).set_index('ID')
# 索引对齐
joined_df = df1.join(df2)
print(joined_df)
参数和选项
- `on`: 指定连接的列名。
- `left_on` 和 `right_on`: 指定左表和右表的连接列。
- `how`: 指定连接的类型,可以是'inner', 'outer', 'left', 'right'。
- `suffixes`: 当两个数据集中有相同名称的列时,用于区分它们的后缀。
实际案例演示
python代码
import pandas as pd
import numpy as np
# 员工信息表
data_employees = {
'EmployeeID': [1, 2, 3, 4],
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'DepartmentID': [101, 102, 101, 103]
}
df_employees = pd.DataFrame(data_employees)
# 部门信息表
data_departments = {
'DepartmentID': [101, 102, 103],
'DepartmentName': ['HR', 'Engineering', 'Marketing']
}
df_departments = pd.DataFrame(data_departments)
# 薪资信息表
data_salaries = {
'EmployeeID': [1, 2, 3],
'Salary': [50000, 60000, 65000]
}
df_salaries = pd.DataFrame(data_salaries)
步骤1:查看数据
首先,查看我们的数据集。
python代码
print("Employees:")
print(df_employees)
print("\nDepartments:")
print(df_departments)
print("\nSalaries:")
print(df_salaries)
步骤2:多表连接
使用内连接合并员工信息、部门信息和薪资信息。
python代码
# 多表连接
merged_df = pd.merge(df_employees, df_departments, on='DepartmentID', how='inner')
merged_df = pd.merge(merged_df, df_salaries, on='EmployeeID', how='inner')
print("\nMerged DataFrame:")
print(merged_df)
步骤3:设置连接条件
假设我们只对工程部(Engineering)的员工感兴趣,并且他们的薪资高于平均水平。
python代码
# 设置连接条件
average_salary = df_salaries['Salary'].mean()
merged_df_filtered = merged_df[(merged_df['DepartmentName'] == 'Engineering') & (merged_df['Salary'] > average_salary)]
print("\nFiltered Merged DataFrame:")
print(merged_df_filtered)
步骤4:索引对齐
如果我们想要将薪资信息与员工信息进行索引对齐,可以使用join()方法。
python代码
# 索引对齐
df_employees.set_index('EmployeeID', inplace=True)
df_salaries.set_index('EmployeeID', inplace=True)
joined_df = df_employees.join(df_salaries)
print("\nJoined DataFrame:")
print(joined_df)
步骤5:参数和选项
在merge()和join()函数中,我们可以使用不同的参数来定制连接的行为。
python代码
# 使用不同的连接参数
merged_df = pd.merge(df_employees, df_departments, on='DepartmentID', how='left', suffixes=('', '_dept'))
merged_df = pd.merge(merged_df, df_salaries, on='EmployeeID', how='left', suffixes=('', '_salary'))
print("\nMerged DataFrame with Suffixes:")
print(merged_df)
步骤6:实际案例演示
通过一个实际的案例,演示多表连接、连接条件设置和索引对齐的应用。
python代码
# 假设我们有另一个数据集,包含更多员工的薪资信息
data_additional_salaries = {
'EmployeeID': [4],
'Salary': [70000]
}
df_additional_salaries = pd.DataFrame(data_additional_salaries)
# 外连接合并所有薪资信息
full_outer_join = pd.merge(df_employees, df_salaries.append(df_additional_salaries), on='EmployeeID', how='outer')
print("\nFull Outer Join:")
print(full_outer_join)