Python DataFrame数据合并:merge()与concat()实战详解

一颗松果
一颗松果
发布时间:2026-10-16 | 4人浏览过
原创

本文详细解析Python中Pandas库的数据合并方法。重点讲解merge()函数的inner、outer、left、right四种连接方式及多对一、多对多场景,并对比concat()在纵向堆叠与横向对齐时的参数配置,通过代码示例展示索引、键值处理及keys标记技巧。

在Python数据处理中,merge()函数用于基于键值进行数据库风格的连接。

常规合并操作主要涉及两种基准设定方式。

第一种方式是通过指定具体的列名作为参照列进行合并。

用户需明确指定一个共同列,系统将以该列为准,将其他对应列的数据进行匹配合并。

import pandas as pd

df1 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num1': [120, 101, 104],
                    'num2': [110, 102, 121],
                    'num3': [105, 120, 113]})
df2 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num4': [80, 86, 79]})
print(df1)
print("=======================================")
print(df2)
print("=======================================")
df_merge = pd.merge(df1, df2, on='id')
print(df_merge)

第二种方式则是基于索引进行合并。

若希望以索引为基准执行合并,需将left_index和right_index参数均设置为True。这两个参数默认值均为False,其中left_index控制左表是否以自身索引为基准,right_index控制右表是否以自身索引为基准。

import pandas as pd

df1 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num1': [120, 101, 104],
                    'num2': [110, 102, 121],
                    'num3': [105, 120, 113]})
df2 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num4': [80, 86, 79]})
print(df1)
print("=======================================")
print(df2)
print("=======================================")

df_merge = pd.merge(df1, df2, left_index=True, right_index=True)
print(df_merge)

与基于列名合并相比,基于索引合并的结果中可能出现重复列,具体表现可参考相关图示。

在使用merge()时,需关注以下关键参数配置。

函数签名为pd.merge(right,how=‘inner’, on=“None”, left_on=“None”, right_on=“None”, left_index=False, right_index=False )。

参数描述
left左表,合并对象,DataFrame或Series
right右表,合并对象,DataFrame或Series
how合并方式,可以是left(左合并), right(右合并), outer(外合并), inner(内合并)
on基准列 的列名
left_on左表基准列列名
right_on右表基准列列名
left_index左列是否以index为基准,默认False,否
right_index右列是否以index为基准,默认False,否

需注意,left_index与right_index参数不能与on参数同时指定,二者互斥。

合并方式包括left、right、outer和inner四种类型。

首先准备两组基础数据用于演示。

构建新的DataFrame数据集以进行后续测试。

import pandas as pd

df1 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num1': [120, 101, 104],
                    'num2': [110, 102, 121],
                    'num3': [105, 120, 113]})
df2 = pd.DataFrame({'id': ['001', '004', '003'],
                    'num4': [80, 86, 79]})
print(df1)
print("=======================================")
print(df2)
print("=======================================")

inner连接为默认模式。

该模式仅保留两个数据集中键值的交集部分。

df_merge = pd.merge(df1, df2, on='id')
print(df_merge)

outer连接模式。

该模式保留两个数据集中键值的并集,未匹配到的值以NaN填充。

df_merge = pd.merge(df1, df2, on='id', how="outer")
print(df_merge)

left连接模式。

该模式保留左数据集中的所有键,右数据集仅显示匹配部分。

df_merge = pd.merge(df1, df2, on='id', how='left')
print(df_merge)

right连接模式。

该模式保留右数据集中的所有键,左数据集仅显示匹配部分。

df_merge = pd.merge(df1, df2, on='id', how='right')
print(df_merge)

多对一合并场景。

import pandas as pd

df1 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num1': [120, 101, 104],
                    'num2': [110, 102, 121],
                    'num3': [105, 120, 113]})
df2 = pd.DataFrame({'id': ['001', '001', '003'],
                    'num4': [80, 86, 79]})
print(df1)
print("=======================================")
print(df2)
print("=======================================")

如示例所示,df2表中存在重复的id1数据。

执行合并操作。

df_merge = pd.merge(df1, df2, on='id')
print(df_merge)

合并结果如相关图示所示。

即使采用默认的Inner方式,仅保留键值交集,但右表中重复的键会导致合并结果中对应行重复出现。

多对多合并场景。

如表1和表2均存在多行id重复的情况。

import pandas as pd
df1 = pd.DataFrame({'id': ['001', '002', '002', '002', '003'],
                    'num1': [120, 101, 104, 114, 123],
                    'num2': [110, 102, 121, 113, 126],
                    'num3': [105, 120, 113, 124, 128]})
df2 = pd.DataFrame({'id': ['001', '001', '002', '003', '001'],
                    'num4': [80, 86, 79, 88, 93]})
print(df1)
print("=======================================")
print(df2)
print("=======================================")

df_merge = pd.merge(df1, df2, on='id')
print(df_merge)

concat()函数用于沿特定轴连接对象。

其完整参数列表为pd.concat(objs, axis=0, join=‘outer’, ignore_index:bool=False,keys=None,levels=None,names=None, verify_integrity:bool=False,sort:bool=False,copy:bool=True)。

参数描述
objsSeries,DataFrame或Panel对象的序列或映射
axis默认为0,表示列。如果为1则表示行。
join默认为"outer",也可以为"inner"
ignore_index默认为False,表示保留索引(不忽略)。设为True则表示忽略索引。

其他重要参数将通过具体实例进行说明。

第一种情况是将具有相同字段的表进行首位相连。

首先准备三组DataFrame数据。

import pandas as pd
df1 = pd.DataFrame({'id': ['001', '002', '003'],
                    'num1': [120, 114, 123],
                    'num2': [110, 102, 121],
                    'num3': [113, 124, 128]})
df2 = pd.DataFrame({'id': ['004', '005'],
                    'num1': [120, 101],
                    'num2': [113, 126],
                    'num3': [105, 128]})
df3 = pd.DataFrame({'id': ['007', '008', '009'],
                    'num1': [120, 101, 125],
                    'num2': [113, 126, 163],
                    'num3': [105, 128, 114]})


print(df1)
print("=======================================")
print(df2)
print("=======================================")
print(df3)

执行合并操作。

dfs = [df1, df2, df3]
result = pd.concat(dfs)
print(result)

若需在合并后标记数据来源或类别,可为concat添加keys参数。

result = pd.concat(dfs, keys=['table1', 'table2', 'table3'])
print(result)

此时,添加的keys与原index组合成元组,共同构成新的多级索引。

print(result.index)

第二种情况是横向表合并(行对齐)。

准备两组DataFrame数据。

import pandas as pd
df1 = pd.DataFrame({'num1': [120, 114, 123],
                    'num2': [110, 102, 121],
                    'num3': [113, 124, 128]}, index=['001', '002', '003'])
df2 = pd.DataFrame({'num3': [117, 120, 101, 126],
                    'num5': [113, 125, 126, 133],
                    'num6': [105, 130, 128, 128]}, index=['002', '003', '004', '005'])

print(df1)
print("=======================================")
print(df2)

当axis参数为默认值0时。

result = pd.concat([df1, df2])
print(result)

若需进行横向合并,需将axis参数设置为1。

result = pd.concat([df1, df2], axis=1)
print(result)

对比以上两种输出结果的差异。

  • 当axis=0(默认纵向合并)时,若出现重复的行索引,结果中将同时体现这些行。
  • 当axis=1(横向合并)时,若出现重复的列索引,结果中将同时体现这些列。

交叉合并示例。

result = pd.concat([df1, df2], axis=1, join='inner')
print(result)

总结。

本文介绍了Python中DataFrame数据合并的merge()和concat()方法,更多相关内容可参考本站其他文章或继续浏览后续内容。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表