news 2026/4/23 10:30:13

11.8 数据合并三剑客:Pandas中merge、concat、join的正确打开方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
11.8 数据合并三剑客:Pandas中merge、concat、join的正确打开方式

文章目录

  • 前言
  • 一、merge:SQL风格的精准合并
  • 二、concat:简单的堆叠操作
  • 三、join:基于索引的便捷合并
  • 四、三大函数对比与选择指南
  • 五、性能优化与避坑指南
  • 总结

前言

在日常数据分析工作中,我们常常遇到这样的场景:数据分散在多个表格中,需要把它们合并起来才能进行完整分析。Pandas提供了三种强大的数据合并工具——merge、concat和join,但它们各自擅长什么?什么时候该用哪一个?


今天我们就来彻底搞懂这三大数据合并神器的使用场景和技巧。

一、merge:SQL风格的精准合并

merge是Pandas中最接近SQL JOIN操作的函数,它基于一个或多个键(key)将两个DataFrame连接起来。

基本语法

python pd.merge(left,right,how='inner',on=None,left_on=None,right_on=None)

核心场景:按关键字段合并

  1. 用户信息 + 订单信息
python# 用户信息表users=pd.DataFrame({'user_id':[1,2,3,4],'user_name':['张三','李四','王五','赵六'],'city':['北京','上海','广州','深圳']})# 订单表orders=pd.DataFrame({'order_id':[101,102,103,104],'user_id':[2,3,2,5],# 注意:用户5在用户表中不存在'amount':[299,599,199,899]})# 内连接:只保留两边都有的用户inner_merge=pd.merge(users,orders,on='user_id',how='inner')print("内连接结果:")print(inner_merge)# 结果:用户2和3的订单,用户1、4、5不在结果中
  1. 多键合并
python# 销售表1sales1=pd.DataFrame({'date':['2023-01-01','2023-01-01','2023-01-02'],'product':['A','B','A'],'region':['North','South','North'],'sales':[100,200,150]})# 销售表2sales2=pd.DataFrame({'date':['2023-01-01','2023-01-01','2023-01-02'],'product':['A','B','B'],'region':['North','South','North'],'profit':[30,60,45]})# 按日期、产品、区域三个字段合并multi_key=pd.merge(sales1,sales2,on=['date','product','region'])print("\n多键合并:")print(multi_key)
  1. merge的四种连接方式
python# 创建示例数据left_df=pd.DataFrame({'key':['A','B','C'],'value_left':[1,2,3]})right_df=pd.DataFrame({'key':['B','C','D'],'value_right':[4,5,6]})print("1. 内连接 (inner) - 默认:")print(pd.merge(left_df,right_df,on='key',how='inner'))print("\n2. 左连接 (left):")print(pd.merge(left_df,right_df,on='key',how='left'))print("\n3. 右连接 (right):")print(pd.merge(left_df,right_df,on='key',how='right'))print("\n4. 外连接 (outer):")print(pd.merge(left_df,right_df,on='key',how='outer'))

记忆技巧:
inner:只要共同的朋友
left:以左表为基准,右表来匹配
right:以右表为基准,左表来匹配
outer:所有朋友都邀请

实用技巧:处理列名冲突

python df1=pd.DataFrame({'key':[1,2],'value':['a','b']})df2=pd.DataFrame({'key':[1,2],'value':['x','y']})# 合并时会自动添加后缀区分result=pd.merge(df1,df2,on='key',suffixes=('_left','_right'))print(result)

二、concat:简单的堆叠操作

concat主要用于沿着某个轴(行或列)将多个DataFrame堆叠在一起,适合结构相似的数据合并。

基本语法

python pd.concat(objs,axis=0,join='outer',ignore_index=False)

核心场景:相同结构数据的批量合并

  1. 多个月份数据的纵向合并
python# 1月销售数据jan_sales=pd.DataFrame({'product':['A','B','C'],'jan_sales':[100,200,150]})# 2月销售数据feb_sales=pd.DataFrame({'product':['A','B','D'],# 注意:产品D是新的'feb_sales':[120,180,90]})# 纵向合并(默认axis=0)vertical_concat=pd.concat([jan_sales,feb_sales],ignore_index=True)print("纵向合并(堆叠行):")print(vertical_concat)
  1. 横向扩展数据维度
python# 产品基本信息product_info=pd.DataFrame({'product':['A','B','C'],'category':['电子','服装','食品']})# 产品价格信息product_price=pd.DataFrame({'product':['A','B','C'],'price':[299,199,89]})# 横向合并(axis=1)horizontal_concat=pd.concat([product_info,product_price.set_index('product')],axis=1)print("\n横向合并(扩展列):")print(horizontal_concat)
  1. concat的join参数
python df1=pd.DataFrame({'A':[1,2]},index=['a','b'])df2=pd.DataFrame({'B':[3,4]},index=['b','c'])print("outer join(默认):")print(pd.concat([df1,df2],axis=1,join='outer'))print("\ninner join:")print(pd.concat([df1,df2],axis=1,join='inner'))

三、join:基于索引的便捷合并

join是merge的简化版,专门用于基于索引的合并操作,语法更加简洁。

基本语法

python df1.join(df2,how='left',lsuffix='',rsuffix='')

核心场景:基于索引的快速合并

  1. 时间序列数据的合并
python# 设置日期索引price_data=pd.DataFrame({'price':[100,102,101,105]},index=pd.date_range('2023-01-01',periods=4,freq='D'))volume_data=pd.DataFrame({'volume':[1000,1200,900,1100]},index=pd.date_range('2023-01-01',periods=4,freq='D'))# 基于索引合并combined=price_data.join(volume_data)print("基于时间索引的合并:")print(combined)
  1. 多层索引的合并
python# 创建多层索引DataFrameindex=pd.MultiIndex.from_tuples([('北京','2023-01'),('北京','2023-02'),('上海','2023-01'),('上海','2023-02')],names=['city','month'])sales=pd.DataFrame({'sales':[100,120,80,95]},index=index)target=pd.DataFrame({'target':[90,110,85,100]},index=index)# 合并多层索引数据result=sales.join(target)print("\n多层索引合并:")print(result)

四、三大函数对比与选择指南

特性mergeconcatjoin
主要用途按列值合并沿轴堆叠按索引合并
类似操作SQL JOIN堆叠/拼接索引对齐
键的类型列值索引索引
语法复杂度中等简单简单
性能中等高(简单操作)
适用场景关系型数据合并同结构数据批量处理时间序列/面板数据

五、性能优化与避坑指南

  1. 合并前的数据准备
python# 最佳实践:合并前做好数据清洗defprepare_for_merge(df,key_column):# 去除关键字段的空值df=df.dropna(subset=[key_column])# 去除重复值df=df.drop_duplicates(subset=[key_column],keep='last')# 确保数据类型一致df[key_column]=df[key_column].astype(str)returndf
  1. 大数据集合并优化
python# 使用更高效的数据类型df['key_column']=df['key_column'].astype('category')# 只选择需要的列columns_needed=['key_column','value1','value2']df1_subset=df1[columns_needed]df2_subset=df2[columns_needed]result=pd.merge(df1_subset,df2_subset,on='key_column')
  1. 常见错误及解决
python# 错误1:键名不匹配# 解决:明确指定左右键pd.merge(df1,df2,left_on='id',right_on='user_id')# 错误2:重复键值导致结果膨胀# 解决:先检查重复值print(f"df1重复键数量:{df1.duplicated('key').sum()}")print(f"df2重复键数量:{df2.duplicated('key').sum()}")# 错误3:内存不足# 解决:分块处理chunk_size=10000results=[]forchunkinpd.read_csv('large_file.csv',chunksize=chunk_size):merged=pd.merge(chunk,lookup_table,on='key')results.append(merged)final_result=pd.concat(results)

总结

Pandas的三大合并函数各有所长,掌握它们的正确使用场景能极大提升数据处理效率:

  1. merge:你的"SQL翻译官",适合复杂的列值匹配
  2. concat:你的"数据装配工",适合结构相同的数据堆叠
  3. join:你的"索引对齐器",适合基于索引的快速合并

记住这个黄金法则:先想清楚你的数据结构,再选择合适的合并工具。不要试图用一个工具解决所有问题,而是要像工匠选择工具一样,根据任务特点选择最合适的那一个。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:42:47

Stable Diffusion WebUI实战宝典:从零到精通的AI绘画之旅

Stable Diffusion WebUI实战宝典:从零到精通的AI绘画之旅 【免费下载链接】stable-diffusion-webui AUTOMATIC1111/stable-diffusion-webui - 一个为Stable Diffusion模型提供的Web界面,使用Gradio库实现,允许用户通过Web界面使用Stable Diff…

作者头像 李华
网站建设 2026/4/17 16:04:55

AI智能二维码工坊压力测试:万级QPS实现方案

AI智能二维码工坊压力测试:万级QPS实现方案 1. 引言 1.1 业务场景与性能挑战 随着移动互联网的普及,二维码已广泛应用于支付、营销、身份认证、物联网设备配网等众多场景。在高并发系统中,如大型电商平台促销、公共交通扫码进站、线上直播…

作者头像 李华
网站建设 2026/4/2 22:41:09

GLM-4.6V-Flash-WEB移动端适配:手机也能操作的专业设计

GLM-4.6V-Flash-WEB移动端适配:手机也能操作的专业设计 你是不是也经常遇到这种情况?作为经常出差的行商,客户临时要你出一张产品图、改个背景、换种风格,甚至想看看穿在模特身上的效果。可你手头只有平板或手机,打开…

作者头像 李华
网站建设 2026/4/23 10:29:49

防撤回工具的终极解决方案:深度解析消息拦截技术

防撤回工具的终极解决方案:深度解析消息拦截技术 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.com/Git…

作者头像 李华
网站建设 2026/4/18 3:05:59

鸣潮自动化助手终极指南:让你彻底告别重复刷图

鸣潮自动化助手终极指南:让你彻底告别重复刷图 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸上锁合成 自动肉鸽 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 还在为每日重复…

作者头像 李华
网站建设 2026/4/20 23:31:49

AB下载管理器实战指南:从零开始掌握高效文件管理

AB下载管理器实战指南:从零开始掌握高效文件管理 【免费下载链接】ab-download-manager A Download Manager that speeds up your downloads 项目地址: https://gitcode.com/GitHub_Trending/ab/ab-download-manager 在当今数字化时代,文件下载已…

作者头像 李华