大毛 豈安科技業務風險分析師
多年訂單業務反欺詐經驗,負責豈安科技多款產品運營工做。mysql
在使用Pandas以前,大多數數據分析師已經掌握了Excel和SQL,而且在剛上手Pandas時會常常習慣性想到「老辦法」。"若是誰能把經常使用的數據查詢語法作個對比就行了 ",我也曾不止一次地想享受前人的成果,無奈發現網上的文章側重不一樣且深淺不一,還涉及到一些Pandas新老版本的問題,因而決定本身動手。sql
假設我有個六列的dataframe:一列是銷售員,一列是所屬團隊,其它四列分別是四個季度的銷售額。函數
首先df['Total ']確保了你在該df內新增了一個column,而後累加即可。學習
df['Total'] = df['Q1']+df['Q2']+df['Q3']+df['Q4']spa
你可能想使用諸如sum()的函數進行這步,很惋惜,sum()方法只能對列進行求和,幸虧它能夠幫咱們求出某季度的總銷售額。df['Q1'].sum(),你就能獲得一個Q1的總銷售額,除此以外,其餘的聚合函數,max,min,mean都是可行的。3d
那麼按團隊進行統計呢?在mysql裏是group by,Pandas裏也不例外,你只須要df.groupby('Team').sum()就能看到指望的答案了。excel
若是你關心誰的整年銷售額最多,那麼就要求助於sort_values方法了,在excel內是右鍵篩選,SQL內是一個orderby。默認是順序排列的,因此要人爲設定爲False,若是你只想看第一名,只須要在該語句末尾添加.head(1) 。blog
接下來就是涉及一些條件值的問題,例如我只關心Team爲A的數據,在Excel裏是篩選框操做,在SQL裏寫個where就能搞定,在Pandas裏須要作切片。排序
查看Pandas文檔時,你可能已經見過各類切片的函數了,有loc,iloc,ix,iy,這裏不會像教科書同樣全部都講一通讓讀者搞混。這種根據列值選取行數據的查詢操做,推薦使用loc方法。文檔
df.loc[df['Team']== 'A',['Salesman', 'Team','Year']],這裏用SQL語法理解更方便,loc內部逗號前面能夠理解爲where,逗號後能夠理解爲select的字段。
若是想全選出,那麼只需將逗號連帶後面的東西刪除做爲缺省,便可達到select *的效果。
在Pandas中多條件切片的寫法會有些繁瑣,df.loc[ (df['Team']== 'A' ) & (df['Total'] > 15000 ) ],添加括號與條件符。
這裏有一個有意思的小應用,若是你想給符合某些條件的員工打上優秀的標籤,你就能夠結合上述新增列和切片兩點,進行條件賦值操做。
df.loc[ (df['Team']== 'A' ) & (df['Total'] > 15000 ) , 'Tag'] = 'Good'
固然這裏只是個舉例,這時候我想刪除Tag列,能夠del df['Tag'],又回到了以前。
接下來要講join了,如今有每小時銷售員的職位對應表pos,分爲Junior和Senior,要將他們按對應關係查到df中。
這裏須要認識一下新朋友,merge方法,將兩張表做爲前兩個輸入,再定義鏈接方式和對應鍵。對應到Excel中是Vlookup,SQL中就是join。在pandas裏的鏈接十分簡單。
df = pd.merge(df, pos, how='inner', on='Salesman')
注意,這個時候其實咱們是獲得了新的df,若是不想覆蓋掉原有的df,你能夠在等號左邊對結果從新命名。
這時候有了兩組標籤列(對應數值列),就能夠進行多重groupby了。
固然這樣的結果並不能公平地反應出哪一組更好,由於每組的組員人數不一樣,可能有平均數的參與會顯得更合理,而且咱們只想依據整年綜合來評價。
這裏的數據是捏造的,不過也一目瞭然了。
最後以最簡單的一個合併操做收尾。
若是我又有一批數據df2,須要將兩部分數據合併。只須要使用concat方法,而後傳一個列表做爲參數便可。不過前提是必需要保證他們具備相同類型的列,即便他們結構可能不一樣(df2的Team列在末尾,也不會影響concat結果,由於pandas具備自動對齊的功能)。
pd.concat([df,df2])
以上就是一些基礎的Pandas數據查詢操做了。做爲Pandas初學者,若是能善用類比遷移的方法進行學習並進行總結是大有裨益的。若是看完本文尚未能瞭解到你關心的查詢方法,能夠留言聯繫,或許還能夠有續集。