當(dāng)Pandas遇到SQL,如何做關(guān)聯(lián)查詢
在日常數(shù)據(jù)查詢時(shí),絕大多數(shù)情況是將表格關(guān)聯(lián)起來進(jìn)行查詢的,而不僅僅是對一張表格的數(shù)據(jù)進(jìn)行查詢,常用的數(shù)據(jù)拼接有兩種方法,一種是以行為單位縱向連接,另一種是以列為單位橫向拼接,縱向連接使用的函數(shù)是UNION,水平拼接使用的函數(shù)是JOIN,本節(jié)使用pandasql庫借助SQL語句進(jìn)行表格連接,下面一起來學(xué)習(xí)。
- 示例工具:anconda3.7
- 本文講解內(nèi)容:pandasql庫的使用、SQL連接
- 適用范圍:在Python中實(shí)現(xiàn)多表連接
數(shù)據(jù)表創(chuàng)建
本節(jié)因?yàn)榘咐枰允孪扔? pandas創(chuàng)建3個(gè)表,數(shù)據(jù)表內(nèi)容包含用戶ID、日期、城市、年齡、性別等字段,三個(gè)表的共同字段都是用戶ID,所以,可以作為連接的主鍵,使用pandas構(gòu)建數(shù)據(jù)表結(jié)果如下。
構(gòu)建第一張表作為基礎(chǔ)表,以用戶ID作為主鍵,進(jìn)行連接。
- import pandas as pd
- import datetime
- #構(gòu)造數(shù)據(jù)集df1
- df1 = pd.DataFrame({'用戶ID':[1001,1002,1003,1004,1005,1006],
- '日期':pd.date_range(datetime.datetime(2021,3,26),periods=6),
- '城市':['北京', '上海', '廣州', '上海', '杭州', '北京'],
- '年齡':[23,44,54,32,34,32],
- '性別':['F','M','M','F','F','F'],
- '成交量':[3200,1356,2133,6733,2980,3452]},
- columns =['用戶ID','日期','城市','年齡','性別','成交量'])
- df1
構(gòu)建第二張表,用于數(shù)據(jù)表的橫向連接。
- #構(gòu)造數(shù)據(jù)集df2
- df2 = pd.DataFrame({'用戶ID':[1007,1008,1009],
- '日期':pd.date_range(datetime.datetime(2021,3,1),periods=3),
- '城市':['北京', '上海', '廣州'],
- '年齡':[33,34,34,],
- '性別':['F','M','F'],
- '成交量':[4200,3356,2633]},
- columns =['用戶ID','日期','城市','年齡','性別','成交量'])
- df2
構(gòu)建第三張表,以用戶ID為主鍵,用于數(shù)據(jù)表的橫向連接。
- #構(gòu)造構(gòu)造列名不同的df3
- df3 = pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006,1007,1008,1009,1010],
- "平臺":['京東','淘寶','京東','天貓','唯品會(huì)','蘇寧','天貓','淘寶','美團(tuán)','拼多多'],
- "收入額":[100000,320000,240000,445000,340000,640000,300000,460000,540000,230000]},
- columns =['id','平臺','收入額'])
- df3
橫向連接
首先是表的橫向連接,顧名思義,就是在原基礎(chǔ)表,往下一空行復(fù)制粘貼新的數(shù)據(jù),要求兩張表的列標(biāo)題都是一樣的,才能正常連接,這里使用UNION ALL進(jìn)行連接,表示將列標(biāo)題相同的兩張表連接起來,如果是使用UNION連接,兩張中相同的兩行只會(huì)保留一行連接。
- #導(dǎo)入pandasql庫
- import pandasql as sql
- #表的橫向連接
- sql.sqldf("""select * from df1
- union all
- select * from df2""")
縱向連接No.1內(nèi)連接
縱向連接是表格連接中使用最廣泛的連接,縱向連接又可以分為內(nèi)連接和外連接,內(nèi)連接,連接表都匹配的記錄才會(huì)出現(xiàn)在最終的結(jié)果集,并且連接順序無關(guān),這里內(nèi)連接的第一種辦法是使用WHERE語句,當(dāng)兩個(gè)表的ID相同時(shí)進(jìn)行連接。
- #內(nèi)連接
- sql.sqldf("""select * from df1,df3
- where df1.用戶ID=df3.id;""")
除了使用WHERE語句進(jìn)行內(nèi)連接,還可以使用INNER JOIN函數(shù)進(jìn)行內(nèi)連接,當(dāng)兩個(gè)表的ID相同時(shí)進(jìn)行連接。
- #內(nèi)連接
- sql.sqldf("""select * from df1
- inner join df3
- on df1.用戶ID=df3.id;""")
縱向連接No.2外連接
外連接以其中一張表為驅(qū)動(dòng)表,與另張表的每條記錄進(jìn)行匹配如果能夠匹配則進(jìn)行關(guān)聯(lián)并展示;如果不能匹配則以null展示,與連接順序有關(guān),這里演示的LEFT JOIN函數(shù),當(dāng)右邊的表與左邊的基礎(chǔ)表的ID一致時(shí),進(jìn)行連接,類似于EXCEL函數(shù)中的VLOOKUP功能。
- #左外連接
- sql.sqldf("""select * from df1
- left join df3
- on df1.用戶ID=df3.id;""")
在日常工作使用左外連接的次數(shù)會(huì)很多,一般都是將多個(gè)表進(jìn)行多次左外連接,這個(gè)知識點(diǎn)需要熟練掌握,將上面的連接結(jié)果分別賦值變量,然后導(dǎo)出,結(jié)果如下。
- #數(shù)據(jù)導(dǎo)出
- write=pd.ExcelWriter(r'C:\Users\尚天強(qiáng)\Desktop'+'\\SQL連接查詢結(jié)果'+'.xlsx')
- sqltable1.to_excel(write,sheet_name='SQL橫向連接',index=False)
- sqltable2.to_excel(write,sheet_name='SQL縱向內(nèi)連接',index=False)
- sqltable3.to_excel(write,sheet_name='SQL縱向左外連接',index=False)
- write.save()
- write.close()
本文轉(zhuǎn)載自微信公眾號「大話數(shù)據(jù)分析」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系大話數(shù)據(jù)分析公眾號。