HOWTO · Pandas
將函式應用於 Pandas DataFrame 中的每一行
本教程演示瞭如何對 DataFrame 中的每一行使用 Pandas 應用函式,以及如何將不同的函式作為引數應用,例如對每一行使用 lambda、numpy 和使用者定義函式。
本頁內容
使用 DataFrame.apply() 搭配 axis=1,即可將每一列傳入可呼叫物件。可呼叫物件會回傳轉換後的列,再由 apply() 將結果組合成 DataFrame。本指南說明如何選擇列軸,並示範 lambda、NumPy 函式,以及帶有和不帶額外引數的自訂函式。
Pandas apply() 函式的基本語法
一般形式為 dataframe.apply(function, axis=1, args=())。當可呼叫物件應接收每一列時,請設定 axis=1。預設值為 axis=0,這會改為傳入欄。以列為單位呼叫時,可呼叫物件會收到一個 Series,其索引包含欄標籤;回傳值則決定結果的形狀。每列都回傳純量時,結果會是 Series;若每列都回傳標籤一致的 Series,結果則會是 DataFrame。
args 用來在列之後提供額外的位置引數。如果自訂可呼叫物件需要一個對每列都相同的值,就可以使用它。如需完整參數說明,請參閱 DataFrame.apply()。
將 lambda 函式應用於 Pandas DataFrame 的每一列
lambda 適合用來執行簡短的轉換。這個範例會將列中的每個值加上 10,並回傳欄位相同的 DataFrame。若邏輯較長,使用具名函式會更容易閱讀和重複使用。
執行以下範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import pandas as pd
dataframe = pd.DataFrame([(1, 34, 23), (11, 31, 11)], columns=list("ABC"))
result = dataframe.apply(lambda row: row + 10, axis=1)
print(result)
A B C
0 11 44 33
1 21 41 21
將 NumPy 函式應用於 Pandas DataFrame 的每一列
當 NumPy 可呼叫物件能逐一處理列中的值時,可以直接傳入。這裡使用 np.sqrt 轉換每個數值儲存格,再由 apply() 組合轉換後的各列。平方根適用於非負數值;若資料包含其他型別,或有不同的領域需求,請改用合適的運算。
執行以下範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import numpy as np
import pandas as pd
dataframe = pd.DataFrame([(4, 9, 16), (25, 36, 49)], columns=list("ABC"))
result = dataframe.apply(np.sqrt, axis=1)
print(result)
A B C
0 2.0 3.0 4.0
1 5.0 6.0 7.0
使用引數將自訂函式應用於 Pandas DataFrame 的每一列
當列轉換所需的邏輯不只是一個簡短運算式時,可以將它定義為函式。在此範例中,row 是第一個引數,而 2 透過 args 作為下一個引數傳入;函式會將每個值加倍。args 必須是位置引數的 tuple,因此單一額外值要寫成 (2,)。
執行以下範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import pandas as pd
def multiply_row(row, factor):
return row * factor
dataframe = pd.DataFrame([(2, 3, 4), (3, 5, 10)], columns=list("ABC"))
result = dataframe.apply(multiply_row, axis=1, args=(2,))
print(result)
A B C
0 4 6 8
1 6 10 20
不帶額外引數將自訂函式應用於 Pandas DataFrame 的每一列
如果運算不需要共用參數,請將可呼叫物件定義為只接收列參數,並直接傳入。此範例會將每列中的值乘以四。回傳的各列會保留標籤,因此結果是欄位與原始資料相同的 DataFrame。
執行以下範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import pandas as pd
def multiply_by_four(row):
return row * 4
dataframe = pd.DataFrame([(2, 3, 4), (3, 5, 10)], columns=list("ABC"))
result = dataframe.apply(multiply_by_four, axis=1)
print(result)
A B C
0 8 12 16
1 12 20 40
當運算需要一個能處理整列的可呼叫物件時,請使用 apply()。如果轉換只是簡單的逐欄算術運算,直接使用向量化運算式會更清楚,也能避免逐列呼叫 Python。