此係列文章收錄在公眾號中:數據大宇宙 > 數據處理 >E-pd
轉發本文並私信我"python",即可獲得Python資料以及更多系列文章(持續更新的)
經常聽別人說 Python 在數據領域有多厲害,結果學了很長時間,連數據處理都麻煩得要死。後來才發現,原來不是 Python 數據處理厲害,而是他有數據分析神器—— pandas
前言
Excel 中名聲最響的就是 vlookup 函數,當然在 Excel 函數公式中用於查找的函數家族也挺大,不過在 pandas 中這功能卻要簡單多了。今天就來看看 pandas 中任何實現 Excel 中的多列批量 vlookup 的效果
案例1:簡單匹配
一天,你收到一份數據源表如下:
- 每個人每個城市的銷售額數據
接著,你需要把下圖的表格從數據源表匹配過來:
- 根據名字與上方的城市名字,從表1中匹配數據
對於 Excel 來說,這需求很簡單,一個 vlookup 即可解決:
- 由於剛好目標表的城市順序與源表順序一樣,因此可以這麼解決
那麼我們來看看 pandas 中怎麼實現:
- 行6、7,由於現在需要姓名匹配,我們把2份數據的姓名列設置為行索引
- 行9,簡單調用 update 方法,表示 df_tg 按照 df_src 更新值
由於 pandas 的數據表(DataFrame) 有行列索引,並且總是行列索引對齊,因此匹配數據是輕而易舉的事情。
注意:本文所有的 pandas 更新方法,都是索引更新,而非遍歷更新,因此速度非常快。別用 vlookup 的速度與其相比
案例2:有缺失
有時候,目標表不是這麼"好說話":
- 這次的城市列只有2列
那麼,用 Excel 的 vlookup 就要配合 match 函數進行動態定位:
不多講解 Excel 的做法了,因為隨著需求難度逐漸提升,公式會越來越"醜"
同樣看看 pandas 的做法:
你可能會覺得是我貼錯了代碼,這不就是案例1的代碼嗎?
你沒看錯,這代碼只是讀取的表名不一樣而已。其他代碼一樣。很簡單吧。
案例3:不存在的列
你可能會疑問:如果目標表本身就有一些數據源不存在的列,那麼更新還能順利嗎:
- 目標表多了一列數據,我們當然希望更新不會影響到這一列
繼續看 pandas 的代碼:
- 是的,他很智能,只會更新列名配對的那些列
案例4:多列匹配
上面的案例只是根據名字來匹配,如果需要根據多個列匹配呢?
如下一份數據源:
- 顆粒為,每人每個城市的指標值
目標表如下:
- 根據 姓名 與 城市 ,匹配出指標
你可能會以為這次我總要用點啥技巧了吧。pandas 沒有那麼多花俏的東西,還是那段代碼:
- 行6和7,設置 姓名 與 城市 作為行索引即可,其他代碼不變
這裡的案例只是行索引為多層索引,實際上即使是列標題為多層複合,也能用同樣的方式匹配。
多層索引及其應用,以及更多關於數據更新的高級應用,請關注我的 pandas 專欄:
總結
本文重點:
- DataFrame.update 是更新值的好工具
- 構造好行列索引,是關鍵
需要源碼的小夥伴請轉發本文並私信我"python"
如果希望從零開始學習 pandas ,那麼可以看看我的 pandas 專欄。
閱讀更多 外星人玩Python 的文章