当前位置: 首页 > news >正文

模块六-数据合并与连接——32. merge 合并(上)

32. merge 合并(上)

1. 概述

merge是 Pandas 中最强大的数据合并函数,类似于 SQL 中的 JOIN 操作。它可以根据一个或多个键将两个 DataFrame 的行连接起来。

importpandasaspdimportnumpyasnp# 创建示例数据# 员工表employees=pd.DataFrame({'员工ID':[101,102,103,104,105],'姓名':['张三','李四','王五','赵六','钱七'],'部门ID':[1,2,1,3,2]})# 部门表departments=pd.DataFrame({'部门ID':[1,2,3,4],'部门名称':['技术部','销售部','市场部','人事部']})print("员工表:")print(employees)print("\n部门表:")print(departments)

2. 内连接(Inner Join)

内连接只保留两个表中键匹配的行。

# 内连接result=pd.merge(employees,departments,on='部门ID',how='inner')print("内连接结果:")print(result)# 等价于result=pd.merge(employees,departments,on='部门ID')print("\n默认是内连接:")print(result)

3. 左连接(Left Join)

左连接保留左表的所有行,右表没有匹配的用 NaN 填充。

# 左连接result=pd.merge(employees,departments,on='部门ID',how='left')print("左连接结果:")print(result)

4. 右连接(Right Join)

右连接保留右表的所有行,左表没有匹配的用 NaN 填充。

# 右连接result=pd.merge(employees,departments,on='部门ID',how='right')print("右连接结果:")print(result)

5. 外连接(Full Outer Join)

外连接保留两个表的所有行,没有匹配的用 NaN 填充。

# 外连接result=pd.merge(employees,departments,on='部门ID',how='outer')print("外连接结果:")print(result)

6. 连接方式对比

# 创建演示数据df_left=pd.DataFrame({'key':['A','B','C','D'],'value_left':[1,2,3,4]})df_right=pd.DataFrame({'key':['B','C','D','E'],'value_right':[5,6,7,8]})print("左表:")print(df_left)print("\n右表:")print(df_right)# 四种连接方式对比joins=['inner','left','right','outer']forjoin_typeinjoins:result=pd.merge(df_left,df_right,on='key',how=join_type)print(f"\n{join_type}连接:")print(result)

7. 多键合并

# 创建多键数据df1=pd.DataFrame({'部门':['技术','技术','销售','销售'],'级别':['P5','P6','P5','P6'],'人数':[10,5,8,3]})df2=pd.DataFrame({'部门':['技术','技术','销售','销售'],'级别':['P5','P6','P5','P6'],'平均工资':[15000,20000,12000,18000]})print("df1:")print(df1)print("\ndf2:")print(df2)# 多键合并result=pd.merge(df1,df2,on=['部门','级别'])print("\n多键合并结果:")print(result)

8. 不同列名合并

# 当两个表的键列名不同时df_emp=pd.DataFrame({'emp_id':[1,2,3],'姓名':['张三','李四','王五'],'dept_id':[101,102,101]})df_dept=pd.DataFrame({'id':[101,102,103],'部门':['技术部','销售部','市场部']})print("员工表:")print(df_emp)print("\n部门表:")print(df_dept)# 指定左右表的键列名result=pd.merge(df_emp,df_dept,left_on='dept_id',right_on='id')print("\n不同列名合并:")print(result)# 删除重复的列result=pd.merge(df_emp,df_dept,left_on='dept_id',right_on='id').drop('id',axis=1)print("\n删除重复列后:")print(result)

9. 处理重复列名

# 创建带重复列名的数据df_a=pd.DataFrame({'key':[1,2,3],'value':['A1','A2','A3'],'common':['X','Y','Z']})df_b=pd.DataFrame({'key':[2,3,4],'value':['B2','B3','B4'],'common':['Y','Z','W']})print("df_a:")print(df_a)print("\ndf_b:")print(df_b)# 默认添加后缀result=pd.merge(df_a,df_b,on='key')print("\n默认后缀:")print(result)# 自定义后缀result=pd.merge(df_a,df_b,on='key',suffixes=('_左','_右'))print("\n自定义后缀:")print(result)

10. 完整示例:订单与客户数据

# 创建订单数据orders=pd.DataFrame({'订单号':['ORD001','ORD002','ORD003','ORD004','ORD005'],'客户ID':[1,2,1,3,4],'金额':[500,800,300,1200,600],'日期':pd.date_range('2024-01-01',periods=5)})# 创建客户数据customers=pd.DataFrame({'客户ID':[1,2,3,5],'姓名':['张三','李四','王五','赵六'],'城市':['北京','上海','广州','深圳'],'等级':['黄金','铂金','黄金','普通']})print("="*60)print("订单与客户数据合并")print("="*60)print("\n订单表:")print(orders)print("\n客户表:")print(customers)# 1. 内连接:只有有客户的订单print("\n1. 内连接(有客户的订单):")inner_join=pd.merge(orders,customers,on='客户ID',how='inner')print(inner_join)# 2. 左连接:所有订单print("\n2. 左连接(所有订单):")left_join=pd.merge(orders,customers,on='客户ID',how='left')print(left_join)# 3. 右连接:所有客户print("\n3. 右连接(所有客户):")right_join=pd.merge(orders,customers,on='客户ID',how='right')print(right_join)# 4. 外连接:所有订单和所有客户print("\n4. 外连接(所有数据):")outer_join=pd.merge(orders,customers,on='客户ID',how='outer')print(outer_join)# 5. 分析:各城市订单金额print("\n5. 各城市订单金额统计:")city_sales=pd.merge(orders,customers,on='客户ID',how='left').groupby('城市')['金额'].sum()print(city_sales)

11. 连接方式总结

连接方式SQL 类比说明
how='inner'INNER JOIN只保留匹配的行
how='left'LEFT JOIN保留左表所有行
how='right'RIGHT JOIN保留右表所有行
how='outer'FULL OUTER JOIN保留两表所有行

http://www.cnnetsun.cn/news/2422164.html

相关文章:

  • 基于BeagleBone Black与LEDscape打造64x64双人LED街机全攻略
  • D2DX:暗黑破坏神2终极现代化补丁,让20年老游戏焕发新生
  • 如何免费解锁百度网盘macOS版SVIP功能:完整破解指南
  • Linux系统下Vue开发环境搭建:从Node.js到Vite的完整指南
  • 基于ESP32-S3与ESP-NOW的无线对讲机:从I2S音频到可靠传输的嵌入式实践
  • 解密Jsxer:如何高效反编译Adobe JSXBIN二进制脚本
  • CompressO:免费开源的终极跨平台视频图片压缩工具
  • 基于Adafruit Flora与NeoPixel的智能滑板灯光系统DIY全攻略
  • 2026届毕业生推荐的十大降AI率平台推荐
  • 基于CircuitPython的巨型机械键盘:从嵌入式开发到定制输入设备实践
  • ElevenLabs中文语音合成优化实战(绕过官方未公开API限制的3种合规方案)
  • DIY导电织物手机屏蔽袋:基于法拉第笼原理的射频信号隔离实践
  • Obsidian Excel插件:在知识管理系统中实现专业表格编辑与数据整合
  • CUDA自动调优工具:原理、实现与工程实践
  • Midjourney钯金印相风格实战手册(2024黄金版):含12组经实验室级验证的/prompt模板+Lightroom钯金LUT预设包(限前200名领取)
  • ElevenLabs匈牙利语音合成效果深度测评(实测12种场景+WAV/MP3/SSML对比数据)
  • Android Studio中文界面终极指南:3个步骤告别英文开发障碍
  • 液体神经网络:小参数模型如何实现动态适应与零样本泛化
  • Linux网络管理利器:nmcli命令行配置静态IP与无线网络实战
  • 网安python毕业设计项目选题帮助
  • 瑞华丽工业软件与 AI 智能体新手部署指南
  • 任天堂 64 缺乏加法混合效果?这项技术让特效无溢出伪影!
  • 新能源电网电磁暂态仿真方法【附仿真】
  • 搞可靠性就是浪费钱?
  • 阅读APP书源终极配置指南:3步免费获取海量小说资源 [特殊字符]
  • FSearch终极指南:如何在Linux上实现秒级文件搜索
  • 微信数据管理遇难题?本地化方案PyWxDump的合规启示与技术探索
  • Office RibbonX Editor:免费开源工具助你轻松定制Office界面
  • Unlock Music终极指南:如何在浏览器中免费解锁12种加密音乐格式
  • J公司S车间布局优化【附代码】