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

模块六-数据合并与连接——32. merge 合并(上) 32. merge 合并上1. 概述merge是 Pandas 中最强大的数据合并函数类似于 SQL 中的 JOIN 操作。它可以根据一个或多个键将两个 DataFrame 的行连接起来。importpandasaspdimportnumpyasnp# 创建示例数据# 员工表employeespd.DataFrame({员工ID:[101,102,103,104,105],姓名:[张三,李四,王五,赵六,钱七],部门ID:[1,2,1,3,2]})# 部门表departmentspd.DataFrame({部门ID:[1,2,3,4],部门名称:[技术部,销售部,市场部,人事部]})print(员工表:)print(employees)print(\n部门表:)print(departments)2. 内连接Inner Join内连接只保留两个表中键匹配的行。# 内连接resultpd.merge(employees,departments,on部门ID,howinner)print(内连接结果:)print(result)# 等价于resultpd.merge(employees,departments,on部门ID)print(\n默认是内连接:)print(result)3. 左连接Left Join左连接保留左表的所有行右表没有匹配的用 NaN 填充。# 左连接resultpd.merge(employees,departments,on部门ID,howleft)print(左连接结果:)print(result)4. 右连接Right Join右连接保留右表的所有行左表没有匹配的用 NaN 填充。# 右连接resultpd.merge(employees,departments,on部门ID,howright)print(右连接结果:)print(result)5. 外连接Full Outer Join外连接保留两个表的所有行没有匹配的用 NaN 填充。# 外连接resultpd.merge(employees,departments,on部门ID,howouter)print(外连接结果:)print(result)6. 连接方式对比# 创建演示数据df_leftpd.DataFrame({key:[A,B,C,D],value_left:[1,2,3,4]})df_rightpd.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:resultpd.merge(df_left,df_right,onkey,howjoin_type)print(f\n{join_type}连接:)print(result)7. 多键合并# 创建多键数据df1pd.DataFrame({部门:[技术,技术,销售,销售],级别:[P5,P6,P5,P6],人数:[10,5,8,3]})df2pd.DataFrame({部门:[技术,技术,销售,销售],级别:[P5,P6,P5,P6],平均工资:[15000,20000,12000,18000]})print(df1:)print(df1)print(\ndf2:)print(df2)# 多键合并resultpd.merge(df1,df2,on[部门,级别])print(\n多键合并结果:)print(result)8. 不同列名合并# 当两个表的键列名不同时df_emppd.DataFrame({emp_id:[1,2,3],姓名:[张三,李四,王五],dept_id:[101,102,101]})df_deptpd.DataFrame({id:[101,102,103],部门:[技术部,销售部,市场部]})print(员工表:)print(df_emp)print(\n部门表:)print(df_dept)# 指定左右表的键列名resultpd.merge(df_emp,df_dept,left_ondept_id,right_onid)print(\n不同列名合并:)print(result)# 删除重复的列resultpd.merge(df_emp,df_dept,left_ondept_id,right_onid).drop(id,axis1)print(\n删除重复列后:)print(result)9. 处理重复列名# 创建带重复列名的数据df_apd.DataFrame({key:[1,2,3],value:[A1,A2,A3],common:[X,Y,Z]})df_bpd.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)# 默认添加后缀resultpd.merge(df_a,df_b,onkey)print(\n默认后缀:)print(result)# 自定义后缀resultpd.merge(df_a,df_b,onkey,suffixes(_左,_右))print(\n自定义后缀:)print(result)10. 完整示例订单与客户数据# 创建订单数据orderspd.DataFrame({订单号:[ORD001,ORD002,ORD003,ORD004,ORD005],客户ID:[1,2,1,3,4],金额:[500,800,300,1200,600],日期:pd.date_range(2024-01-01,periods5)})# 创建客户数据customerspd.DataFrame({客户ID:[1,2,3,5],姓名:[张三,李四,王五,赵六],城市:[北京,上海,广州,深圳],等级:[黄金,铂金,黄金,普通]})print(*60)print(订单与客户数据合并)print(*60)print(\n订单表:)print(orders)print(\n客户表:)print(customers)# 1. 内连接只有有客户的订单print(\n1. 内连接有客户的订单:)inner_joinpd.merge(orders,customers,on客户ID,howinner)print(inner_join)# 2. 左连接所有订单print(\n2. 左连接所有订单:)left_joinpd.merge(orders,customers,on客户ID,howleft)print(left_join)# 3. 右连接所有客户print(\n3. 右连接所有客户:)right_joinpd.merge(orders,customers,on客户ID,howright)print(right_join)# 4. 外连接所有订单和所有客户print(\n4. 外连接所有数据:)outer_joinpd.merge(orders,customers,on客户ID,howouter)print(outer_join)# 5. 分析各城市订单金额print(\n5. 各城市订单金额统计:)city_salespd.merge(orders,customers,on客户ID,howleft).groupby(城市)[金额].sum()print(city_sales)11. 连接方式总结连接方式SQL 类比说明howinnerINNER JOIN只保留匹配的行howleftLEFT JOIN保留左表所有行howrightRIGHT JOIN保留右表所有行howouterFULL OUTER JOIN保留两表所有行