当前位置:首页 > Python > 正文

Python表格合并的两种方法:merge与concat详解 | 数据处理教程

Python表格合并的两种方法

使用pandas的merge和concat高效合并数据表格

为什么要合并表格?

在实际数据处理工作中,数据通常分散在多个表格中。合并表格可以:

  • 整合多个数据源的信息
  • 根据共同字段关联相关数据
  • 纵向堆叠相同结构的数据
  • 减少数据冗余并提高分析效率

准备工作

在开始之前,请确保已安装pandas库:

pip install pandas

导入pandas并创建示例数据:

import pandas as pd

# 创建员工信息表
employees = pd.DataFrame({
    'employee_id': [101, 102, 103, 104],
    'name': ['张三', '李四', '王五', '赵六'],
    'department': ['销售', '技术', '市场', '技术']
})

# 创建销售数据表
sales = pd.DataFrame({
    'employee_id': [101, 102, 101, 103, 105],
    'sales_amount': [15000, 22000, 18000, 9000, 12000],
    'quarter': ['Q1', 'Q1', 'Q2', 'Q1', 'Q2']
})

方法一:使用merge()横向合并

merge()方法用于基于一个或多个键将两个DataFrame横向合并,类似于SQL的JOIN操作。

基本用法

# 基本合并(默认内连接)
merged_inner = pd.merge(employees, sales, on='employee_id')
print("内连接结果:")
print(merged_inner)

连接类型

merge支持多种连接方式:

  • inner:内连接(默认),只保留键匹配的行
  • left:左连接,保留左侧DataFrame的所有行
  • right:右连接,保留右侧DataFrame的所有行
  • outer:外连接,保留所有行
# 左连接示例
merged_left = pd.merge(employees, sales, on='employee_id', how='left')
print("\n左连接结果:")
print(merged_left)

# 外连接示例
merged_outer = pd.merge(employees, sales, on='employee_id', how='outer')
print("\n外连接结果:")
print(merged_outer)

多键合并

当需要多个键匹配时,可以传递列表:

# 假设我们还有季度部门数据
dept_data = pd.DataFrame({
    'department': ['销售', '技术', '市场', '技术'],
    'quarter': ['Q1', 'Q1', 'Q1', 'Q2'],
    'target': [100000, 80000, 70000, 90000]
})

# 多键合并(部门和季度)
multi_merge = pd.merge(merged_inner, dept_data, on=['department', 'quarter'])
print("\n多键合并结果:")
print(multi_merge)

方法二:使用concat()纵向堆叠

concat()方法用于沿特定轴(通常是行)堆叠多个DataFrame对象,适用于相同结构的表格数据。

基本用法

# 创建两个相同结构的DataFrame
df1 = pd.DataFrame({
    'A': ['A0', 'A1', 'A2'],
    'B': ['B0', 'B1', 'B2'],
    'C': ['C0', 'C1', 'C2']
})

df2 = pd.DataFrame({
    'A': ['A3', 'A4', 'A5'],
    'B': ['B3', 'B4', 'B5'],
    'C': ['C3', 'C4', 'C5']
})

# 纵向堆叠
result = pd.concat([df1, df2])
print("纵向堆叠结果:")
print(result)

处理索引

默认情况下concat会保留原始索引,可以使用ignore_index重置索引:

# 重置索引
result_reset = pd.concat([df1, df2], ignore_index=True)
print("\n重置索引后的结果:")
print(result_reset)

横向拼接

通过设置axis=1可以进行横向拼接:

# 横向拼接
df3 = pd.DataFrame({
    'D': ['D0', 'D1', 'D2'],
    'E': ['E0', 'E1', 'E2']
})

result_horizontal = pd.concat([df1, df3], axis=1)
print("\n横向拼接结果:")
print(result_horizontal)

处理不同列

当DataFrame具有不同列时,concat会自动填充NaN:

df4 = pd.DataFrame({
    'A': ['A6', 'A7', 'A8'],
    'B': ['B6', 'B7', 'B8'],
    'D': ['D6', 'D7', 'D8']
})

# 合并不同列
result_diff_columns = pd.concat([df1, df4], ignore_index=True)
print("\n合并不同列结果:")
print(result_diff_columns)

两种方法对比

特性 merge() concat()
主要用途 基于键的横向合并 沿轴堆叠(纵向/横向)
类似SQL操作 JOIN UNION ALL
合并依据 指定键(列) 索引或位置
处理不同列 只保留共同列 保留所有列,缺失值填充NaN
最佳场景 关联不同来源的相关数据 合并相同结构的数据

选择指南

  • 当需要基于共同列关联两个表格时,使用merge()
  • 当需要堆叠多个相同结构的数据集时,使用concat()
  • 当需要横向组合不同特征集且它们有相同索引时,使用concat(axis=1)
  • 当需要完全自定义合并逻辑时,考虑使用join()方法

总结

在Python中使用pandas合并表格主要有两种方法:

merge()

  • 基于一个或多个键横向合并
  • 支持多种连接类型(内连接、左连接等)
  • 适合关联不同来源的相关数据
  • 类似SQL的JOIN操作

concat()

  • 沿轴堆叠多个DataFrame
  • 支持纵向(axis=0)和横向(axis=1)拼接
  • 适合合并相同结构的数据
  • 类似SQL的UNION ALL操作

最佳实践建议

  • 合并前检查数据质量(缺失值、重复值)
  • 明确指定连接键(避免歧义)
  • 使用suffixes参数解决列名冲突
  • 处理大型数据集时注意内存使用
  • 合并后验证结果行数和列数

发表评论