Python案例如何用Pandas做数据合并

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据合并

  1. 准备示例数据
  2. 纵向合并 (concat)
  3. 横向合并 (merge)
  4. 多键合并
  5. 连接部门信息
  6. 实战案例:销售数据分析
  7. 高级合并技巧

我来详细讲解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数据合并的主要方法:

  1. pd.concat():纵向或横向合并多个DataFrame
  2. pd.merge():类似SQL的JOIN操作
  3. merge各种连接方式
    • inner:交集
    • left:左连接
    • right:右连接
    • outer:并集
  4. 多键合并:使用多个列作为连接键
  5. 索引合并:使用索引作为连接键

这些方法可以灵活处理各种数据合并需求,是数据清洗和分析中非常重要的技能。

抱歉,评论功能暂时关闭!