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