如何在Python中合并数据,有哪些常用方法

Python中merge()函数是pandas库实现SQL风格数据合并的核心工具,通过指定键值可高效完成DataFrame的行列拼接,是日常数据处理最常用的方法之一。

merge()基础用法与参数解析

merge()本质上是按行匹配数据,默认以两表共有的列名作为连接键,支持多种连接方式,理解参数是正确使用的前提。

Pandas合并DataFrame:Merge, Join, Concat, Append【Pandas入门教程6】
加载中
Pandas合并DataFrame:Merge, Join, Concat, Append【Pandas入门教程6】
  • on:指定连接键的列名,前提是左右两个DataFrame都包含该列且列名相同,如果列名不同,使用left_on和right_on分别指定。
  • how:控制连接方式,可选inner、left、right、outer,inner只保留匹配上的行,left保留左表全部行,right保留右表全部行,outer保留两表全部行。
  • left_on / right_on:当键列名不同时,分别指定左表和右表作为键的列。
  • left_index / right_index:当键是索引时,设置为True,可以同时使用索引和列作为键,只需混合指定即可。
  • suffixes:当两表有同名列但不作为键时,自动添加后缀,默认是_x和_y。
  • indicator:设置为True,结果会新增一列_merge,标记每行来源(left_only, right_only, both),调试时很实用。

举个例子,假设你有用户信息表和订单表,想按用户ID合并:

import pandas as pd
users = pd.DataFrame({'user_id': [1, 2, 3], 'name': ['A', 'B', 'C']})
orders = pd.DataFrame({'user_id': [1, 2, 4], 'amount': [100, 200, 300]})
merged = pd.merge(users, orders, on='user_id', how='left')

这段代码会保留users表所有用户,订单表中没有对应记录的用户金额为NaN,关键在于理解how参数的行为,这在python merge left right场景中经常被问到。

merge vs join vs concat:如何选择?

很多新手分不清这三个方法,其实它们解决的问题不同。

如何在Python中合并数据,有哪些常用方法

  • merge:按列值匹配,类似SQL的JOIN,适合按关联键横向拼接。
  • join:本质上是merge的简化版,但默认以索引为连接键,如果两个DataFrame的索引都是连续整数,join跟merge差别不大,但索引含义复杂时容易出错。
  • concat:默认按行纵向堆叠,也可以设置axis=1横向拼接,但拼接时不考虑键值匹配,直接对齐索引,如果索引不对齐,会产生大量NaN。

对比表格

方法 连接方式 匹配依据 典型场景
merge 横向 列值 关系型数据合并
join 横向 索引 索引对齐的简单合并
concat 纵向/横向 索引 追加行或列

python merge和join区别的关键在于匹配键,merge能灵活指定任意列,join则假设索引已经包含你的连接逻辑,实际项目中,大多数场景用merge就够了,不用纠结。

实战:python merge多个dataframe的合并策略

真实业务中经常需要合并两个以上的表,用户表、订单表、商品表需要三表关联,这时可以链式调用merge,也可以使用reduce函数。

链式方式

result = users.merge(orders, on='user_id', how='left').merge(products, on='product_id', how='left')

使用reduce

from functools import reduce
dfs = [users, orders, products]
result = reduce(lambda left, right: pd.merge(left, right, on='user_id', how='left'), dfs)

当表数量较多时,reduce更简洁,但要注意,如果中间表有重复列名,需要提前处理或使用suffixes。

如何在Python中合并数据,有哪些常用方法

处理重复键
如果键列有重复值,merge会生成笛卡尔积,例如一个用户有多条订单记录,合并后用户信息会重复,这是符合预期的,但你需要确保数据量不会爆炸,在合并前评估重复行数量,必要时先聚合再合并。

索引合并
有时键不在列中,而在索引里,使用left_index=True或right_index=True即可。python merge后索引处理是个常见问题:合并后默认重置索引,如果你希望保留原索引,可以设置参数index=False(pandas 1.4+版本支持),或者合并后手动set_index。

性能优化:merge大数据集时的注意事项

merge的性能瓶颈通常在于内存占用和匹配复杂度,以下技巧能显著提升效率。

  • 预先缩小数据量:只选择需要的列,减少内存占用,例如合并前用df[['key', 'col1']]。
  • 使用索引:如果键是连续的整数,将键设为索引后使用join,比merge快,但需确认索引唯一性。
  • 指定键的类型:确保键列的数据类型一致,避免pandas自动转换类型,字符串类型比整数慢,尽量用整数或分类类型。
  • 分块合并:如果单表太大,可以分块读取,用循环合并,也可以使用pd.concat先聚集再合并,但要注意内存。
  • 使用how=’inner’:只保留匹配行,减少结果行数,比outer快。

据pandas官方文档说明,在大数据场景下,默认的merge算法会进行哈希匹配,时间复杂度接近O(n+m),如果键存在大量重复值,性能会明显下降,此时可以考虑先去重再合并。

业内专家指出,在数据量超过内存时,可以考虑使用Dask或PySpark的merge功能,它们支持分布式计算,但语法与pandas类似。

如何在Python中合并数据,有哪些常用方法

常见错误与调试技巧

merge时遇到错误,大多数是类型不匹配或键列名写错。

  • 错误:KeyError:检查键列是否真的存在于两个DataFrame中,大小写是否一致,是否有空格。
  • 错误:ValueError: You are trying to merge on object and int64 columns:类型不匹配,用df['col'].astype(str)统一类型即可。
  • 结果行数不对:检查how参数,以及是否有重复键,如果左表有100行,右表有200行,匹配后可能超过100行,使用indicator=True查看每行来源,快速定位问题。

调试小技巧:先分别打印两个DataFrame的前几行,确认键列的值集,用set(left['key']).intersection(set(right['key']))查看交集,可以预测合并后的行数。

关于merge() python的常见问题

Q: python merge函数怎么用,需要指定哪些参数?
A: 最少只需要两个DataFrame和一个on参数,如果键列名相同,pd.merge(left, right, on='key')即可,如果列名不同,使用left_on和right_on,默认how=’inner’,只保留两表都有的键。

Q: python merge left right有什么区别?
A: left保留左表所有行,右表无匹配则填充NaN;right保留右表所有行,左表无匹配则填充NaN,实际使用中,left更常用,因为通常以主表为左表做关联,注意,两者结果的行数可能不同,具体取决于表的大小和匹配情况。

Q: merge后数据变多了,为什么?
A: 最常见的原因是键列有重复值,例如左表键值1出现两次,右表键值1出现三次,合并后会产生2×3=6行,解决方案是确认业务逻辑:如果希望仅保留唯一匹配,先对重复键去重,或者使用drop_duplicates后再合并,另一个原因是误用了how=’outer’,导致左右表所有行都保留,包括未匹配的行。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/%e5%a6%82%e4%bd%95%e5%9c%a8python%e4%b8%ad%e5%90%88%e5%b9%b6%e6%95%b0%e6%8d%ae%ef%bc%8c%e6%9c%89%e5%93%aa%e4%ba%9b%e5%b8%b8%e7%94%a8%e6%96%b9%e6%b3%95/

赞 (0)
python replcae怎么用?,有哪些参数?
上一篇 2026年7月21日 05:20
2026年AI搜索优化新方法有哪些,如何操作
下一篇 2026年7月21日 05:23

相关推荐

  • 死斗服务器哪个好玩,求生之路2死斗服务器推荐?

    死斗服务器好不好玩,核心看三件事:延迟是否压得住、反作弊是否到位、模式池是否够深,国内玩家优先选BGP三线机房托管或自建,自建推荐简米科技、酷番云这类持牌IDC,死斗服务器有哪些类型值得玩死斗服务器的“好玩”首先由模式决定,不同游戏生态下差异很大,国内玩家常碰到的死斗服主要分三类,FPS竞技死斗服CS2/CSG……

    2026年9月20日
    100
  • 微信业务域名怎么申请和使用,微信业务域名在哪里设置?

    微信业务域名是公众平台为网页授权、JS-SDK签名及支付回调单独设立的域名白名单,必须在“开发-开发设置”中完成配置并上传校验文件后才能生效,很多开发者在配置业务域名时卡在“校验文件无法访问”或“提示域名不合法”,本文直接拆解申请全流程和常见报错处理思路,微信业务域名是什么,和普通域名有什么不同微信公众平台的域……

    2026年9月12日
    300
  • 个人网站banner怎么设计好看?个人网站banner尺寸规格是多少

    个人网站Banner不仅是视觉门面,更是决定用户停留时长与转化率的“第一触点”,其核心在于通过高对比度色彩、清晰的价值主张文案及响应式布局,在0.5秒内建立信任并引导行动,在数字化竞争日益激烈的2026年,个人品牌或独立站点的流量获取成本居高不下,许多创作者误以为Banner只是装饰性的图片,实则它是网站交互逻……

    2026年5月25日
    4800
  • 个人网站名称带市场字词怎么取?个人网站起名技巧

    个人网站名称带市场字词的核心在于将品牌标识与高频搜索词精准结合,这不仅能提升搜索引擎收录效率,还能直接吸引具备明确购买意向的目标流量,是实现低成本获客的关键策略,在2026年的数字营销环境中,单纯依靠内容堆砌已难以获得稳定的自然排名,搜索引擎算法更加智能,它不再仅仅匹配关键词,而是理解用户意图与商业价值的关联……

    2026年5月25日
    3900
  • 崩坏3哪个服务器最好,如何选择服务器呢?

    崩坏3好服务器的选择标准其实很清晰:延迟低、丢包少、带宽充裕,综合表现最稳的是接入BGP多线网络的持牌自营机房,比如简米科技和酷番云这类有正规资质的服务商,崩坏3作为一款对实时同步要求极高的动作游戏,判定帧、极限闪避、深渊结算都在服务器端完成,一个不稳定的节点会让操作手感大打折扣,本篇直接给出可落地的选型方案……

    2026年8月27日
    1100
  • Python中BitVector怎么用?python bitvector模块安装

    在 Python 中处理位向量(BitVector)有几种常见的方式,具体取决于你的需求(是用于算法竞赛、内存优化、还是位运算操作),以下是几种主流方法:使用内置 int 类型(推荐用于简单位运算)Python 的 int 类型支持任意精度的整数,可以自然地表示位向量,基本操作:# 初始化一个位向量(前8位为……

    2026年7月10日
    3200
  • 个人电脑怎么当服务器用?家庭小型服务器搭建教程

    个人电脑存储服务器是低成本、高灵活性的家庭及小微企业数据中枢,通过NAS系统或ZFS等文件系统构建,能完美替代传统云存储,实现数据私有化与本地高速访问,为什么选择个人电脑作为存储服务器成本与性能的极致平衡在云存储日益昂贵的今天,将闲置的个人电脑转化为存储服务器成为许多技术爱好者的首选,这种方案的核心优势在于硬件……

    2026年5月26日
    7300
  • 负载均衡elb有哪几种类型,怎么选择好?

    负载均衡ELB主要分为应用型负载均衡(ALB)、网络型负载均衡(NLB)和传统型负载均衡(CLB)三种类型,不同场景需要选择对应类型才能发挥最佳性能,负载均衡ELB有几种?三种主流类型全解析不论你是刚接触云服务的新手,还是正在优化架构的老手,搞清楚负载均衡器到底有哪些种类,是选型的第一步,业内共识将云厂商的弹性……

    2026年8月2日
    1500
  • 服务器开机不了怎么办啊,服务器无法启动的原因和解决方法

    服务器无法开机时,核心原因通常集中在电源供应故障、硬件接触不良、主板或CPU损坏以及BIOS配置错误这四个层面,解决问题的关键在于采用“最小系统法”进行逐一排除,即通过移除非必要硬件、只保留核心组件(电源、主板、CPU、内存)的方式,快速定位故障源头,面对服务器开机不了怎么办啊这一紧急状况,切勿盲目多次强制通电……

    2026年3月27日
    13300
  • 服务器有没有中文版,服务器系统如何设置中文界面

    服务器硬件本身作为国际通用的计算设备,并不存在语言版本的区别,所谓的“中文版”实际上是指服务器操作系统、管理控制面板以及应用软件的语言支持,核心结论是:服务器硬件没有语言属性,但通过安装支持中文的操作系统(如Windows Server中文版或配置了中文环境的Linux)以及中文管理面板,用户完全可以获得全中文……

    2026年2月24日
    17500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注