本文目录导读:

我来详细讲解Pandas中数据合并的几种主要方法,并配有实际案例。
准备示例数据
首先创建几个用于演示的数据集:
import pandas as pd
# 员工基本信息表
df_employee = pd.DataFrame({
'员工ID': ['E001', 'E002', 'E003', 'E004'],
'姓名': ['张三', '李四', '王五', '赵六'],
'部门': ['技术部', '市场部', '财务部', '技术部']
})
print("员工基本信息表:")
print(df_employee)
# 员工薪资表
df_salary = pd.DataFrame({
'员工ID': ['E001', 'E002', 'E003', 'E005'],
'月薪': [15000, 12000, 18000, 14000],
'入职日期': ['2023-01-15', '2023-02-20', '2023-03-10', '2023-04-01']
})
print("\n员工薪资表:")
print(df_salary)
# 部门信息表
df_dept = pd.DataFrame({
'部门': ['技术部', '市场部', '财务部', '人事部'],
'部门负责人': ['张经理', '李经理', '王经理', '刘经理'],
'办公地点': ['A栋3楼', 'B栋2楼', 'A栋5楼', 'C栋1楼']
})
print("\n部门信息表:")
print(df_dept)
纵向合并 (concat)
适用于行方向合并数据:
# 创建两个季度的销售数据
df_q1 = pd.DataFrame({
'月份': ['1月', '2月', '3月'],
'销售额': [100, 150, 200],
'季度': ['Q1', 'Q1', 'Q1']
})
df_q2 = pd.DataFrame({
'月份': ['4月', '5月', '6月'],
'销售额': [180, 220, 250],
'季度': ['Q2', 'Q2', 'Q2']
})
# 纵向合并
df_year = pd.concat([df_q1, df_q2], ignore_index=True)
print("纵向合并后的全年数据:")
print(df_year)
# 处理多个DataFrame
df_q3 = pd.DataFrame({
'月份': ['7月', '8月', '9月'],
'销售额': [210, 190, 230],
'季度': ['Q3', 'Q3', 'Q3']
})
df_all = pd.concat([df_q1, df_q2, df_q3], ignore_index=True)
print("\n前三季度数据:")
print(df_all)
横向合并 (merge)
1 内连接 (inner join)
# 内连接:只保留匹配的记录
df_inner = pd.merge(df_employee, df_salary, on='员工ID', how='inner')
print("内连接结果:")
print(df_inner)
2 左连接 (left join)
# 左连接:保留左边表的所有记录
df_left = pd.merge(df_employee, df_salary, on='员工ID', how='left')
print("左连接结果:")
print(df_left)
3 右连接 (right join)
# 右连接:保留右边表的所有记录
df_right = pd.merge(df_employee, df_salary, on='员工ID', how='right')
print("右连接结果:")
print(df_right)
4 外连接 (outer join)
# 外连接:保留所有记录
df_outer = pd.merge(df_employee, df_salary, on='员工ID', how='outer')
print("外连接结果:")
print(df_outer)
多键合并
# 创建更复杂的数据表
df_orders = pd.DataFrame({
'订单号': ['ORD001', 'ORD002', 'ORD003'],
'客户ID': ['C001', 'C002', 'C001'],
'产品': ['产品A', '产品B', '产品C'],
'金额': [500, 300, 800]
})
df_customers = pd.DataFrame({
'客户ID': ['C001', 'C002', 'C003'],
'客户名': ['小明', '小红', '小刚'],
'城市': ['北京', '上海', '广州']
})
# 多键合并
df_order_detail = pd.merge(
df_orders,
df_customers,
on='客户ID',
how='left'
)
print("\n订单详细信息:")
print(df_order_detail)
连接部门信息
# 将员工表与部门表连接
df_employee_detail = pd.merge(
df_employee,
df_dept,
on='部门',
how='left'
)
print("员工部门详细信息:")
print(df_employee_detail)
# 还可以链式合并多个表
df_complete = df_employee_detail.merge(
df_salary,
on='员工ID',
how='left'
)
print("\n完整的员工信息表:")
print(df_complete)
实战案例:销售数据分析
# 创建销售相关数据
df_products = pd.DataFrame({
'产品ID': ['P001', 'P002', 'P003', 'P004'],
'产品名': ['笔记本电脑', '手机', '平板', '耳机'],
'类别': ['电子产品', '电子产品', '电子产品', '配件']
})
df_sales = pd.DataFrame({
'订单ID': ['S001', 'S002', 'S003', 'S004', 'S005'],
'产品ID': ['P001', 'P002', 'P001', 'P003', 'P005'],
'数量': [2, 3, 1, 5, 2],
'单价': [5000, 3000, 5000, 2000, 500],
'日期': ['2024-01-15', '2024-01-16', '2024-01-17', '2024-01-18', '2024-01-19']
})
df_stores = pd.DataFrame({
'店铺ID': ['ST01', 'ST02', 'ST03'],
'店铺名': ['旗舰店', '分店A', '分店B'],
'城市': ['北京', '上海', '广州']
})
# 合并分析数据
# 1. 销售明细与产品信息合并
df_sales_detail = pd.merge(
df_sales,
df_products,
on='产品ID',
how='left'
)
# 2. 计算销售金额
df_sales_detail['销售金额'] = df_sales_detail['数量'] * df_sales_detail['单价']
# 3. 按类别汇总
sales_summary = df_sales_detail.groupby('类别').agg({
'销售金额': 'sum',
'数量': 'sum'
}).reset_index()
print("销售明细:")
print(df_sales_detail)
print("\n销售汇总(按类别):")
print(sales_summary)
高级合并技巧
1 指定连接键的左右列名
# 当连接键的列名不同时
df_left = pd.DataFrame({
'key1': ['A', 'B', 'C'],
'value1': [1, 2, 3]
})
df_right = pd.DataFrame({
'key2': ['A', 'B', 'D'],
'value2': [4, 5, 6]
})
# 使用left_on和right_on指定不同的列名
df_merged = pd.merge(
df_left,
df_right,
left_on='key1',
right_on='key2',
how='inner'
)
print("指定不同列名合并:")
print(df_merged)
2 索引合并
# 使用索引作为连接键
df_left_idx = df_employee.set_index('员工ID')
df_right_idx = df_salary.set_index('员工ID')
df_idx_merge = pd.merge(
df_left_idx,
df_right_idx,
left_index=True,
right_index=True
)
print("\n使用索引合并:")
print(df_idx_merge)
Pandas数据合并的主要方法:
- pd.concat():纵向或横向合并多个DataFrame
- pd.merge():类似SQL的JOIN操作
- merge各种连接方式:
- inner:交集
- left:左连接
- right:右连接
- outer:并集
- 多键合并:使用多个列作为连接键
- 索引合并:使用索引作为连接键
这些方法可以灵活处理各种数据合并需求,是数据清洗和分析中非常重要的技能。