pandas 如何將一列多樣複雜類型的數值批量apply轉換

一 、 前言:

在實際數據分析時, 我們常常要對不規範的數據進行規整化,一般規整化的過程比較繁瑣。 如果採用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"))

我們得到的結果如下:


完美的解決了這個問題。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章