Pandas DataFrame DataFrame.apply() 函式

Suraj Joshi 2023年1月30日
  1. pandas.DataFrame.apply() 語法
  2. 示例程式碼:DataFrame.apply() 方法
  3. 示例程式碼:用 DataFrame.apply() 將函式應用到每一列
  4. 示例程式碼:用 DataFrame.apply() 方法將函式應用到每一行
  5. 示例程式碼:DataFrame.apply() 方法,引數為 result_type
Pandas DataFrame DataFrame.apply() 函式

pandas.DataFrame.apply() 函式將輸入函式應用於呼叫者 Pandas DataFrame 的每一行或每一列元素。

pandas.DataFrame.apply() 語法

DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwds)

引數

func 要應用於每一行或每一列的函式
axis 沿著行(axis=0)或列(axis=1)來應用函式
raw 布林型別. 行/列以 Series 物件(raw=False)或 ndarray 物件(raw=True)形式傳遞的行/列
result_type {expand, reduce, broadcast, None}
操作輸出的型別只適用於 axis=1(列)
在 0.23.0 版本中新增
args func 函式的位置引數
**kwds 函式 func 的關鍵字引數

返回值

它沿著指定的軸應用輸入函式後返回 DataFrame

示例程式碼:DataFrame.apply() 方法

import pandas as pd

df = pd.DataFrame({'X': [1, 2, 3,],
                   'Y': [4, 1, 8]})
print(df)
modified_df=df.apply(lambda x: x**2)
print(modified_df)

輸出:

   X  Y
0  1  4
1  2  1
2  3  8
   X   Y
0  1  16
1  4   1
2  9  64

我們使用 DataFrame.apply() 方法將一個 lambda 函式 lambda x: x**2 應用到 DataFrame 的所有元素。

Lambda 函式是 Python 中比較簡單的函式定義方式。

lambda x: x**2 表示將 x 作為輸入並返回 x**2 作為輸出的函式。

示例程式碼:用 DataFrame.apply() 將函式應用到每一列

import pandas as pd
import numpy as np

df = pd.DataFrame({'X': [1, 2, 3,],
                   'Y': [4, 1, 8]})
print("Original DataFrame")
print(df)
modified_df=df.apply(np.sum)
print("Modified DataFrame")
print(modified_df)

輸出:

Original DataFrame
   X  Y
0  1  4
1  2  1
2  3  8
Modified DataFrame
X     6
Y    13
dtype: int64

這裡,np.sum 被應用到每一列,因為在這種情況下 axis=0(預設值)。

因此,在使用 df.apply() 方法後,我們得到每列中元素的總和。

import pandas as pd
df = pd.DataFrame({'X': [1, 2, 3,],
                   'Y': [4, 1, 8]})
print(df)
modified_df=df.apply(lambda x: (x**2)  if x.name == 'X' else x)
print(modified_df)

輸出:

   X  Y
0  1  4
1  2  1
2  3  8
   X  Y
0  1  4
1  4  1
2  9  8

如果我們希望只將函式應用於某些列,我們使用 if 語句修改函式定義來過濾列。在本例中,函式只修改了列名為 X 的列的值。

示例程式碼:用 DataFrame.apply() 方法將函式應用到每一行

import pandas as pd
import numpy as np

df = pd.DataFrame({'X': [1, 2, 3,],
                   'Y': [4, 1, 8]})
print("Original DataFrame")
print(df)
modified_df=df.apply(np.sum, axis=1)
print("Modified DataFrame")
print(modified_df)

輸出:

Original DataFrame
   X  Y
0  1  4
1  2  1
2  3  8
Modified DataFrame
0     5
1     3
2    11
dtype: int64

這裡,np.sum 被應用於到每一行,因為我們設定了 axis=1

因此,在使用 df.apply() 方法後,我們得到所有行的單個元素的總和。

import pandas as pd

df = pd.DataFrame({'X': [1, 2, 3,],
                   'Y': [4, 1, 8]})
print(df)
modified_df=df.apply(lambda x: (x**2)  if x.name in [0,1] else x,
                     axis=1)
print(modified_df)

輸出:

   X  Y
0  1  4
1  2  1
2  3  8
   X   Y
0  1  16
1  4   1
2  3   8

如果我們希望只將函式應用於某些行,我們使用 if 語句修改函式定義來過濾行。在這個例子中,函式只修改了索引 01 的行的值,即只修改了第一行和第二行。

示例程式碼:DataFrame.apply() 方法,引數為 result_type

如果我們使用 result_type 引數的預設值,即 None,它將不加任何修改地返回 DataFrame

import pandas as pd

df = pd.DataFrame({'X': [1, 2, 3,],
                   'Y': [4, 1, 8]})
print("Original DataFrame")
print(df)

modified_df=df.apply(lambda x:[1,1],axis=1)
print("Modified DataFrame")
print(modified_df)

輸出:

Original DataFrame
   X  Y
0  1  4
1  2  1
2  3  8
Modified DataFrame
0    [1, 1]
1    [1, 1]
2    [1, 1]
dtype: object

在上面的例子中,每一行都被傳遞到函式中,並且行的值被設定為 [1,1]

如果我們想修改函式對 DataFrame 操作後的結果型別,可以根據自己的需要設定 result_type 的值。

import pandas as pd

df = pd.DataFrame({'X': [1, 2, 3,],
                   'Y': [4, 1, 8]})
print("Original DataFrame")
print(df)

modified_df=df.apply(lambda x:[1,1],
                     axis=1,
                     result_type='expand')
print("Modified DataFrame")
print(modified_df)

輸出:

Original DataFrame
   X  Y
0  1  4
1  2  1
2  3  8
Modified DataFrame
   0  1
0  1  1
1  1  1
2  1  1

設定 result_type='expand'將所有列表式的值擴充套件到 Dataframe 的列中。

作者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

相關文章 - Pandas DataFrame