1 apply()
函數
1.1 apply()
函數簡介
- Pandas提供了很多數據處理的API,但當提供的API不能滿足需求的時候,需要自己編寫數據處理函數, 這個時候可以使用
apply()
函數; apply()
函數可以接收一個自定義函數,可以將DataFrame的行或列數據傳遞給自定義函數處理;apply()
函數類似于編寫了一個for循環,遍歷行/列的每一個元素,但比使用for循環效率高很多。
1.2 使用方法
-
數據準備:
-
自定義一個求平方的函數:
-
apply()
函數有一個func
參數,用于接收一個函數,然后應用于Series的每個元素- 注意:傳入的是函數名,不要帶上
()
- 注意:傳入的是函數名,不要帶上
-
如果自定義的函數有其它參數需要傳入時:
-
上面是將自定義函數作用于Series,也可以作用于一整個DataFrame:
-
如果自定義函數中有輸出語句:
-
注意:
apply()
函數是直接將一整個DataFrame或者Series作為一個參數傳遞給自定義函數- 從報錯的信息中看到,實際上
avg_3
函數接收到的只有一個變量,這個變量可以是DataFrame的行也可以是DataFrame的列;
- 從報錯的信息中看到,實際上
-
使用
apply()
函數的時候,可以通過axis
參數指定按行或者按列傳入數據;-
axis = 0
:按列處理(默認) -
axis = 1
:按行處理
-
2 apply()
使用案例
-
使用titanic數據集,先加載數據:
-
準備三個函數:
-
把前面定義好的函數應用于數據的各列:
-
把前面定義好的函數應用于數據的各行:
3 函數向量化
-
準備一個DataFrame:
-
創建一個自定義函數,用于計算DataFrame中每行的平均值:
-
修改一下上面的自定義函數,在其中加入一個
if
判斷,結果發現報錯:ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
是因為在avg_2_mod
函數中,嘗試對pandas
的Series
對象進行布爾判斷,而這種判斷在pandas
中是不明確的;x == 20
的問題:- 在
avg_2_mod()
函數中,x
是df['a']
,它是一個pandas
的Series
對象; x == 20
會返回一個布爾型的Series
,表示df['a']
中每個元素是否等于 20;- 然而,
if
語句需要一個單一的布爾值,而不是一個布爾型的Series
,因此會導致報錯;
- 在
-
解決1:使用
np.vectorize()
將函數向量化 -
解決2:使用
@np.vectorize
裝飾器,可以自動將一個普通的 Python 函數轉換為向量化函數
4 Lambda表達式
-
當函數比較簡單的時候, 沒有必要用
def
創建函數,可以使用Lambda表達式創建匿名函數lambda x: x + 1
是一個匿名函數,它接受一個參數x
,并返回x + 1
;
-
或者: