上一篇
Python表格合并的两种方法:merge与concat详解 | 数据处理教程
- Python
- 2025-08-15
- 1152
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
参数解决列名冲突 - 处理大型数据集时注意内存使用
- 合并后验证结果行数和列数
本文由LongXiaoMai于2025-08-15发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://heyang.jltcw.com/20258240.html
发表评论