一 、 前言:
在實際數據分析時, 我們常常要對不規範的數據進行規整化,一般規整化的過程比較繁瑣。 如果採用pandas 的apply 函數可以快速的批量規整。
二、 案例
例如我們有一份旅客預定房間情況: abe 預訂了 1號房, tom 預訂了 2、4、5號房, sam 預訂了 3號房。現在我們希望知道這些旅客預訂的第一個房間。
1. 從一列序列值批量取元素
假設我們拿到下面一份程序員錄入的表:
其中,name 爲旅客名字, rooms 爲旅客預定的房間(可以有多個),rooms 的所有值 都是序列類型的。
現在我們採用apply 內嵌 lambda 函數取序列第一個元素的方法, 就可以方便地得到旅客預定的第一個房間:
2. 從一列 複雜多樣數據類型 的數值批量取元素
然而, 實際當中錄入數據更可能把rooms 錄入單個的數據(即int 型),我們得到的初始表如下:
這個時候, 前面的方法會報錯, 因爲id = 0,2時, rooms 的值均不是list 類型, 執行到 lambda x:x[0] 會報錯。
即便採用try except異常處理, 雖然程序可以正常運行, 但不能達到轉換的效果。
但假如我們在lambda 函數中考慮了異常的情況: 就可以直接轉換了。(見我的上一篇博文 python lambda 函數處理異常。)
代碼如下:
def getLambda(x, exec_str, ep_str):
val = 0
try:
exec(exec_str)
except:
exec(ep_str)
return val
df['1st_room'] = df['rooms'].apply(lambda x:getLambda(x, "val = x[0]", "val = x"))
我們得到的結果如下:
完美的解決了這個問題。