0

0

Pandas中怎样高效合并多个数据表?concat技巧

爱谁谁

爱谁谁

发布时间:2025-07-25 12:19:02

|

1149人浏览过

|

来源于php中文网

原创

最直接高效组合多个pandas数据表的方式是使用pd.concat函数,它能根据指定轴向(行或列)将多个数据帧堆叠拼接。1. 按行合并(axis=0)适用于列结构相同、需增加行数据的情况,如合并不同时间段的销售数据;2. 按列合并(axis=1)适用于行索引对齐、需增加列数据的情况,如将不同指标数据按id对齐拼接;使用时需注意索引对齐与缺失值处理,默认保留所有索引与列并填充nan,可通过ignore_index=true重置索引,或设置join='inner'保留共有列/行。

Pandas中怎样高效合并多个数据表?concat技巧

最直接也最常用的方式,来将多个Pandas数据表高效地组合在一起,就是利用pd.concat函数。它能够根据你指定的轴向(行或列),将一系列数据帧“堆叠”起来,非常适合处理结构相似的数据集。

Pandas中怎样高效合并多个数据表?concat技巧

解决方案

当你手头有一堆数据表,它们可能来自不同的文件,或者是在不同时间点收集到的,并且你希望将它们按行(纵向)或者按列(横向)拼接起来时,pd.concat就是那个你首先应该考虑的工具。它不像pd.merge那样需要基于共同的键进行匹配,concat更像是纯粹的“粘合”操作。

基本用法非常直观:

Pandas中怎样高效合并多个数据表?concat技巧
import pandas as pd

# 假设我们有几个数据表
df_sales_q1 = pd.DataFrame({
    'Date': ['2023-01-01', '2023-01-02'],
    'Product': ['A', 'B'],
    'Revenue': [100, 150]
})

df_sales_q2 = pd.DataFrame({
    'Date': ['2023-04-01', '2023-04-02'],
    'Product': ['C', 'A'],
    'Revenue': [200, 120]
})

df_product_info = pd.DataFrame({
    'Product': ['A', 'B', 'C'],
    'Category': ['Electronics', 'Books', 'Food']
})

# 1. 按行合并(默认行为,axis=0)
# 适用于列结构相同,想增加行数据的情况
all_sales_data = pd.concat([df_sales_q1, df_sales_q2])
print("按行合并所有销售数据:\n", all_sales_data)

# 2. 按列合并(axis=1)
# 适用于行索引对齐,想增加列数据的情况
# 注意:这里如果Product列不唯一,或者索引不一致,可能会出现NaN
# 假设我们想把产品信息作为新列加到销售数据旁,这通常不是concat的典型场景,但可以演示
# 更好的做法是先设置索引或使用merge
# df_sales_q1_indexed = df_sales_q1.set_index('Product')
# df_product_info_indexed = df_product_info.set_index('Product')
# combined_by_cols = pd.concat([df_sales_q1_indexed, df_product_info_indexed], axis=1)
# print("\n按列合并(需注意索引对齐):\n", combined_by_cols)

# 更常见按列concat是:多个DataFrame有相同行索引但不同列
df_metrics_a = pd.DataFrame({'ID': [1, 2, 3], 'Metric_A': [10, 20, 30]})
df_metrics_b = pd.DataFrame({'ID': [1, 2, 3], 'Metric_B': [100, 200, 300]})
# 先设置ID为索引,确保按ID对齐
df_metrics_a_indexed = df_metrics_a.set_index('ID')
df_metrics_b_indexed = df_metrics_b.set_index('ID')
combined_metrics = pd.concat([df_metrics_a_indexed, df_metrics_b_indexed], axis=1)
print("\n按列合并(基于索引对齐):\n", combined_metrics)

几个关键参数和注意事项:

  • objs:这是一个列表,里面包含你想要合并的所有DataFrame或Series对象。
  • axisaxis=0 是默认值,表示按行堆叠(纵向合并),即把第二个DataFrame的行加到第一个的下面。axis=1 表示按列拼接(横向合并),即把第二个DataFrame的列加到第一个的右边。
  • ignore_index:默认是 False。如果设置为 True,合并后的DataFrame会重新生成一个从0开始的、连续的整数索引,而忽略原始DataFrame的索引。这在按行合并时特别有用,可以避免重复索引。
  • join:默认是 outer
    • join='outer':保留所有列(或行)并填充 NaN。这是最常见的需求,因为它能确保数据不丢失。
    • join='inner':只保留所有数据帧共有的列(或行)。这就像数据库的内连接,只取交集。

使用pd.concat时如何处理索引和缺失数据?

这确实是个让人头疼的问题,尤其当数据来源复杂、结构不完全一致时。concat在处理索引和缺失值上,有它自己的一套逻辑,理解它能省去很多后续清洗的麻烦。

Interior AI
Interior AI

AI室内设计,上传室内照片自动帮你生成多种风格的室内设计图

下载
Pandas中怎样高效合并多个数据表?concat技巧

首先说索引。默认情况下,pd.concat会把所有参与合并的DataFrame的原始索引都带过来。比如你把两个都有0, 1, 2索引的DataFrame按行拼接,结果就会出现多套0, 1, 2。这在某些分析场景下可能没问题,但如果你想把结果当作一个全新的、独立的表来操作,或者后续要进行基于索引的查找,重复索引就成了个坑。

解决办法很简单,就是用ignore_index=True。它会强制Pandas在合并后重新生成一个从0开始的、不重复的整数索引。这对于按行堆叠来自不同源但列结构相同的数据时,几乎是必选项。

df_part1 = pd.DataFrame({'Data': [10, 20]}, index=['A', 'B'])
df_part2 = pd.DataFrame({'Data': [30, 40]}, index=['C', 'D'])

# 默认行为:保留原始索引,可能导致重复
concatenated_default = pd.concat([df_part1, df_part2])
print("默认索引行为:\n", concatenated_default)

# 使用 ignore_index=True:生成新的连续索引
concatenated_new_index = pd.concat([df_part1, df_part2], ignore_index=True)
print("\n使用 ignore_index=True:\n", concatenated_new_index)

再聊缺失值。concat在处理不同结构的数据表时,尤其是在axis=1(按列)合并或者axis=0(按行)合并但列不完全一致时,会自动引入NaN。这是因为它要保证所有原始数据都能被容纳进来。

举个例子,按列合并时,如果一个DataFrame有列A, B,另一个有列C, D,结果表就会有A, B, C, D。对于第一个DataFrame,C, D列就会是NaN,反之亦然。这种行为由join参数控制:

  • join='outer' (默认):保留所有列/行,缺失部分填充NaN。这是最常见的需求,因为它能确保数据不丢失。
  • join='inner':只保留所有DataFrame都共有的列(或行)。这就像数据库的内连接,只取交集。当你确定只需要那些在所有表中都存在的字段时,这个选项能帮你快速清理掉不相关的列。
df_products = pd.DataFrame({'ProductID': [1, 2], 'Name': ['Laptop', 'Mouse']})
df_prices = pd.DataFrame({'ProductID': [1, 3], 'Price': [1200, 50]}) # 注意Product ID 3
df_stock = pd.DataFrame({'ProductID': [1, 2], 'Stock': [100, 50]})

# 按行合并,列名不完全一致,默认outer join
# 这里是演示join参数,实际场景中按行合并一般要求列名一致
df_a = pd.DataFrame({'Col1': [1, 2], 'Col2': [3, 4]})
df_b = pd.DataFrame({'Col1': [5, 6], 'Col3': [7, 8]})
concatenated_outer_cols = pd.concat([df_a, df_b], axis=0, join='outer')
print("\n按行 outer join (列名不同):\n", concatenated_outer_cols)

# 按行合并,inner join (只保留共有列 Col1)
concatenated_inner_cols = pd.concat([df_a, df_b], axis=0, join='inner')
print("\n按行 inner join (只保留共有列):\n

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

51

2025.12.04

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

387

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

571

2023.08.10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

344

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2074

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

347

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

253

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

322

2023.10.09

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.7万人学习

Django 教程
Django 教程

共28课时 | 3.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号