Pandas高效合并数据表方法分享
时间:2025-07-19 14:07:38 450浏览 收藏
知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个文章开发实战,手把手教大家学习《Pandas高效合并数据表技巧分享》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!
最直接高效组合多个Pandas数据表的方式是使用pd.concat函数,它能根据指定轴向(行或列)将多个数据帧堆叠拼接。1. 按行合并(axis=0)适用于列结构相同、需增加行数据的情况,如合并不同时间段的销售数据;2. 按列合并(axis=1)适用于行索引对齐、需增加列数据的情况,如将不同指标数据按ID对齐拼接;使用时需注意索引对齐与缺失值处理,默认保留所有索引与列并填充NaN,可通过ignore_index=True重置索引,或设置join='inner'保留共有列/行。
最直接也最常用的方式,来将多个Pandas数据表高效地组合在一起,就是利用pd.concat
函数。它能够根据你指定的轴向(行或列),将一系列数据帧“堆叠”起来,非常适合处理结构相似的数据集。

解决方案
当你手头有一堆数据表,它们可能来自不同的文件,或者是在不同时间点收集到的,并且你希望将它们按行(纵向)或者按列(横向)拼接起来时,pd.concat
就是那个你首先应该考虑的工具。它不像pd.merge
那样需要基于共同的键进行匹配,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对象。axis
:axis=0
是默认值,表示按行堆叠(纵向合并),即把第二个DataFrame的行加到第一个的下面。axis=1
表示按列拼接(横向合并),即把第二个DataFrame的列加到第一个的右边。ignore_index
:默认是False
。如果设置为True
,合并后的DataFrame会重新生成一个从0开始的、连续的整数索引,而忽略原始DataFrame的索引。这在按行合并时特别有用,可以避免重复索引。join
:默认是outer
。join='outer'
:保留所有列(或行)并填充NaN
。这是最常见的需求,因为它能确保数据不丢失。join='inner'
:只保留所有数据帧共有的列(或行)。这就像数据库的内连接,只取交集。
使用pd.concat时如何处理索引和缺失数据?
这确实是个让人头疼的问题,尤其当数据来源复杂、结构不完全一致时。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
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
356 收藏
-
240 收藏
-
211 收藏
-
258 收藏
-
261 收藏
-
350 收藏
-
160 收藏
-
358 收藏
-
247 收藏
-
264 收藏
-
151 收藏
-
407 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习