news 2026/4/15 13:27:23

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/4 1:53:30

AB下载管理器:智能下载加速与文件管理全攻略

AB下载管理器:智能下载加速与文件管理全攻略 【免费下载链接】ab-download-manager A Download Manager that speeds up your downloads 项目地址: https://gitcode.com/GitHub_Trending/ab/ab-download-manager 在当今数字化时代,高效的文件下载…

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

BGE-Reranker-v2-m3入门教程:第一个重排序项目

BGE-Reranker-v2-m3入门教程:第一个重排序项目 1. 引言 在构建高效、精准的检索增强生成(RAG)系统时,向量数据库的初步检索结果往往存在“搜不准”的问题——即返回的文档虽然与查询在关键词或向量距离上相近,但语义…

作者头像 李华
网站建设 2026/4/13 19:44:30

仿写Zotero插件文章的Prompt

仿写Zotero插件文章的Prompt 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件,提供了一系列功能来增强 Zotero 的用户体验,如阅读进度可视化和标签管理,适合研究人员和学者。 项目地址: https://gitcode.com/GitHub_Trendin…

作者头像 李华
网站建设 2026/4/2 5:06:00

研发支出的“千头万绪”,如何轻松理清?

研发支出种类繁多:人员工资、材料消耗、设备折旧、外协合作……这些费用可能来自财务系统、采购系统、人事系统,散落在各处。每到归集时,财务人员就像“拼图大师”,需要在海量数据中筛选、判断、汇总,工作量巨大且易错…

作者头像 李华
网站建设 2026/4/2 9:10:45

跑BERT模型省钱攻略:云端按需付费,比买显卡省万元

跑BERT模型省钱攻略:云端按需付费,比买显卡省万元 你是不是也遇到过这种情况:接了一个NLP项目,需要用 bert-base-chinese 做文本分类微调,任务量不大,总共就训练几个小时,但本地没有GPU&#x…

作者头像 李华
网站建设 2026/4/10 17:07:21

FTP高可用方案与企业私有化部署

在现代企业数字化转型进程中,文件传输作为数据流动的核心环节,其稳定性与安全性直接影响着业务连续性。尽管传统的FTP协议因其简单通用而被长期沿用,但其在应对企业级复杂需求时所暴露的局限性也日益凸显。本文将深入探讨FTP服务的高可用性保…

作者头像 李华