登录
首页 >  文章 >  python教程

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中怎样高效合并多个数据表?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在处理索引和缺失值上,有它自己的一套逻辑,理解它能省去很多后续清洗的麻烦。

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

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>