news 2026/5/17 0:59:24

模块六-数据合并与连接——34. join 方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
模块六-数据合并与连接——34. join 方法

34. join 方法

1. 概述

join是 DataFrame 的方法,专门用于基于索引进行合并。它比merge更简洁,特别适合按行索引连接两个 DataFrame。

importpandasaspdimportnumpyasnp# 创建示例数据np.random.seed(42)

2. join 基础用法

2.1 基本语法

# 创建两个以索引为键的 DataFramedf1=pd.DataFrame({'姓名':['张三','李四','王五','赵六'],'年龄':[25,30,28,32]},index=['A','B','C','D'])df2=pd.DataFrame({'城市':['北京','上海','广州','深圳'],'工资':[8000,12000,10000,15000]},index=['A','B','C','E'])print("df1:")print(df1)print("\ndf2:")print(df2)# 默认左连接(基于索引)result=df1.join(df2)print("\n左连接结果:")print(result)

2.2 连接方式

# 左连接(默认)left_join=df1.join(df2,how='left')print("左连接:")print(left_join)# 右连接right_join=df1.join(df2,how='right')print("\n右连接:")print(right_join)# 内连接inner_join=df1.join(df2,how='inner')print("\n内连接:")print(inner_join)# 外连接outer_join=df1.join(df2,how='outer')print("\n外连接:")print(outer_join)

3. join vs merge 对比

# merge 方式merge_result=pd.merge(df1,df2,left_index=True,right_index=True,how='left')print("merge 方式:")print(merge_result)# join 方式(更简洁)join_result=df1.join(df2,how='left')print("\njoin 方式:")print(join_result)print("\n结果相同:",merge_result.equals(join_result))

4. 使用列作为连接键

join也可以使用列作为连接键(通过on参数)。

# 创建使用列作为键的数据df_left=pd.DataFrame({'员工ID':[101,102,103,104],'姓名':['张三','李四','王五','赵六'],'部门ID':[1,2,1,3]})df_right=pd.DataFrame({'部门ID':[1,2,3,4],'部门名称':['技术部','销售部','市场部','人事部']},index=[1,2,3,4])# 索引与连接键不同print("左表:")print(df_left)print("\n右表:")print(df_right)# 左表用列,右表用索引result=df_left.join(df_right,on='部门ID',how='left')print("\n使用 on 参数:")print(result)

5. 多 DataFrame 连接

# 创建多个 DataFramedf_base=pd.DataFrame({'ID':[1,2,3,4]},index=['A','B','C','D'])df_info1=pd.DataFrame({'姓名':['张三','李四','王五','赵六']},index=['A','B','C','D'])df_info2=pd.DataFrame({'年龄':[25,30,28,32]},index=['A','B','C','D'])df_info3=pd.DataFrame({'城市':['北京','上海','广州','深圳']},index=['A','B','C','D'])# 链式 joinresult=df_base.join([df_info1,df_info2,df_info3])print("多 DataFrame 连接:")print(result)

6. 处理重复列名

# 创建有重复列名的数据df_a=pd.DataFrame({'共同列':[1,2,3],'值A':['A1','A2','A3']},index=['X','Y','Z'])df_b=pd.DataFrame({'共同列':[2,3,4],'值B':['B2','B3','B4']},index=['Y','Z','W'])print("df_a:")print(df_a)print("\ndf_b:")print(df_b)# 默认添加后缀result=df_a.join(df_b,how='outer',lsuffix='_左',rsuffix='_右')print("\n带后缀的连接:")print(result)

7. 完整示例:员工信息整合

# 创建多个数据源print("="*60)print("员工信息整合")print("="*60)# 基础信息basic_info=pd.DataFrame({'员工ID':[1001,1002,1003,1004,1005],'姓名':['张三','李四','王五','赵六','钱七']}).set_index('员工ID')# 部门信息dept_info=pd.DataFrame({'员工ID':[1001,1002,1003,1004,1005],'部门':['技术部','销售部','技术部','市场部','销售部']}).set_index('员工ID')# 薪资信息salary_info=pd.DataFrame({'员工ID':[1001,1002,1003,1004,1006],'工资':[8000,12000,10000,15000,11000]}).set_index('员工ID')# 绩效信息performance_info=pd.DataFrame({'员工ID':[1001,1002,1003,1005,1006],'绩效':['A','B','A','B','C']}).set_index('员工ID')print("基础信息:")print(basic_info)print("\n部门信息:")print(dept_info)print("\n薪资信息:")print(salary_info)print("\n绩效信息:")print(performance_info)# 1. 逐步整合print("\n1. 整合基础+部门:")result=basic_info.join(dept_info,how='left')print(result)# 2. 整合薪资print("\n2. 整合薪资:")result=result.join(salary_info,how='left')print(result)# 3. 整合绩效print("\n3. 整合绩效:")result=result.join(performance_info,how='left')print(result)# 4. 链式整合print("\n4. 链式整合:")final=basic_info.join([dept_info,salary_info,performance_info],how='left')print(final)# 5. 统计print("\n5. 各部门平均工资:")dept_avg=final.groupby('部门')['工资'].mean().round(0)print(dept_avg)# 6. 缺失值分析print("\n6. 数据完整性:")print(f"总员工数:{len(final)}")print(f"有工资信息的员工:{final['工资'].notna().sum()}")print(f"有绩效信息的员工:{final['绩效'].notna().sum()}")

8. join vs merge 对比

特性joinmerge
默认连接键索引
语法df1.join(df2)pd.merge(df1, df2)
多表连接df1.join([df2, df3])需要多次调用
灵活性较低较高
适用场景基于索引合并基于列合并

9. 参数详解

参数说明默认值
other要连接的 DataFrame必填
on左表用于连接的列名None
how连接方式'left'
lsuffix左表重复列后缀''
rsuffix右表重复列后缀''
sort是否按索引排序False

10. 总结

需求方法示例
基于索引连接df1.join(df2)df1.join(df2)
左连接join(df2, how='left')df1.join(df2, how='left')
内连接join(df2, how='inner')df1.join(df2, how='inner')
多表连接join([df2, df3])df1.join([df2, df3])
处理重复列lsuffix='_左', rsuffix='_右'df1.join(df2, lsuffix='_左', rsuffix='_右')
使用列连接join(df2, on='key')df1.join(df2, on='key')

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

基于RK3568核心板的智能家居控制器:从硬件选型到软件架构实战

1. 项目概述:当智能家居控制器遇上国产高性能核心板最近在做一个智能家居中控的案子,客户对性能、成本和本地化能力要求都比较高。选型阶段,我们团队把市面上主流的几款ARM核心板都摸了一遍,从传统的树莓派CM4到全志、瑞芯微的方案…

作者头像 李华
网站建设 2026/5/17 0:56:05

3步掌握缠论量化分析:基于TradingView的可视化实战指南

3步掌握缠论量化分析:基于TradingView的可视化实战指南 【免费下载链接】chanvis 基于TradingView本地SDK的可视化前后端代码,适用于缠论量化研究,和其他的基于几何交易的量化研究。 缠论量化 摩尔缠论 缠论可视化 TradingView TV-SDK 项目…

作者头像 李华
网站建设 2026/5/17 0:51:56

雷达目标检测与成像算法实时实现【附代码】

✨ 长期致力于阵列雷达、多输入多输出、现场可编程门阵列、目标检测定位、高分辨成像研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)相控阵和差波束目…

作者头像 李华
网站建设 2026/5/17 0:49:27

别再踩坑了!HBuilderX+微信开发者工具搞定小程序模糊定位(附完整manifest.json与page.json配置)

HBuilderX与微信小程序模糊定位配置全指南:避开90%开发者踩过的坑 微信小程序的模糊定位功能已经成为各类LBS应用的刚需,但许多开发者在集成时总在manifest.json和page.json的配置环节栽跟头。上周我接手一个紧急项目时,团队已经在这个问题上…

作者头像 李华