当前位置: 首页 > 科技观察

Pandas遇到SQL,如何做关联查询

时间:2023-03-11 22:51:15 科技观察

在日常的数据查询中,大多数情况下是关联表进行查询,而不仅仅是表的数据。常用的数据拼接有两种方式,一种是以行为单位的垂直拼接,一种是以列为单位的水平拼接。用于垂直连接的函数是UNION,用于水平拼接的函数是JOIN。本节使用pandasql库,借助SQL语句Connect进行建表,下面一起来学习一下。示例工具:anconda3.7本文内容:pandasql库的使用,SQL连接适用范围:Python多表连接数据表创建本节视情况需要用pandas提前创建3张表,而数据表的内容包括用户ID、日期、城市、年龄、性别等字段,三张表的共同字段都是用户ID,所以可以作为连接的主键,结果使用pandas建立数据表的方法如下。建第一张表作为基础表,使用用户ID作为主键进行连接。importpandasaspdimportdatetime#构造数据集df1df1=pd.DataFrame({'用户ID':[1001,1002,1003,1004,1005,1006],'date':pd.date_range(datetime.datetime(2021,3,26),periods=6),'city':['北京','上海','广州','上海','杭州','北京'],'age':[23,44,54,32,34,32],'性别':['F','M','M','F','F','F'],'音量':[3200,1356,2133,6733,2980,3452]},columns=['userID','date','city','age','gender','volume'])df1构建第二张表,用于数据表的横向连接。#构造数据集df2df2=pd.DataFrame({'用户ID':[1007,1008,1009],'date':pd.date_range(datetime.datetime(2021,3,1),periods=3),'city':['北京','上海','广州'],'年龄':[33,34,34,],'性别':['F','M','F'],'音量':[4200,3356,2633]},columns=['userID','date','city','age','gender','volume'])df2建第三张表,usersID为主键,用于数据表的水平连接。#Constructdf3df3=pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006,1007,1008,1009,1010],"platform":['京东','淘宝','京东','天猫','唯品会','苏宁','天猫','淘宝','美团','拼多多'],"收入":[100000,320000,240000,445000,340000,640000,300000,460000,540000,230000]},columns=['id','platform','income'])df3水平连接首先是表的水平连接,顾名思义,就是在原来的基本表中,复制和将新数据粘贴到下一个空白行。要求两个表的列标题相同才能正常连接。这里使用UNIONALL进行连接,意思是将两张列标题相同的表连接起来。如果是使用UNION连接,那么两个sheet中相同的两行只会保留一个连接。#导入pandasql库importpandasqlassql#表的水平连接sql.sqldf("""select*fromdf1unionallselect*fromdf2""")垂直连接No.1内连接垂直连接是表连接中使用最广泛的连接,垂直连接可以分为内连接和外连接,内连接,与连接表匹配的记录会出现在最终的结果集中,与连接顺序无关。这里内连接的第一种方法是使用WHERE语句。当两个表的ID相同时同时连接。#内连接sql.sqldf("""select*fromdf1,df3whereedf1.UserID=df3.id;""")除了使用WHERE语句进行内连接外,还可以使用INNERJOIN函数进行内连接。当两个表的ID相同时连接。#Innerjoinsql.sqldf("""select*fromdf1innerjoindf3ondf1.UserID=df3.id;""")VerticaljoinNo.2Outerjoinouterjoin以其中一张表为驱动表,其他各一张tables如果可以匹配到记录,则进行关联显示;如果匹配不到,则显示为null,这与连接顺序有关。这里演示的LEFTJOIN函数,当右边的表ID和左边的基本表ID一致时,进行连接,类似EXCEL函数中的VLOOKUP函数。#Leftouterjoinsql.sqldf("""select*fromdf1leftjoindf3ondf1.UserID=df3.id;""")在日常工作中会大量使用leftouterjoin。一般多张表都留外连接,这个知识点需要掌握,将上面的连接结果分别赋值给变量,然后导出,结果如下。#dataexportwrite=pd.ExcelWriter(r'C:\Users\尚天强\Desktop'+'\\SQL连接查询结果'+'.xlsx')sqltable1.to_excel(write,sheet_name='SQL横向连接',index=False)sqltable2.to_excel(write,sheet_name='SQLverticalinnerjoin',index=False)sqltable3.to_excel(write,sheet_name='SQLverticalleftouterjoin',index=False)write.save()write。close()本文转载自微信公众号《大话数据分析》,可通过以下二维码关注。转载本文请联系大华数据分析公众号。