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。