Pandas apply, map 和 applymap 的區別

Suraj Joshi 2023年1月30日 2021年2月28日
  1. pandas.DataFrame.applymap()
  2. Pandas 中的 map() 方法
  3. Pandas 中的 apply() 方法
Pandas apply, map 和 applymap 的區別

本教程解釋了 Pandas 中 apply()map()applymap() 方法之間的區別。

applymap() 相關聯的函式被應用於給定的 DataFrame 的所有元素,因此 applymap() 方法只針對 DataFrames 定義。同樣,與 apply() 方法相關聯的函式可以應用於 DataFrame 或 Series 的所有元素,因此 apply() 方法是為 Series 和 DataFrame 物件定義的。Pandas 中的 map() 方法只能為 Series 物件定義。

import pandas as pd

df = pd.DataFrame({
    'Col 1': [30,40,50,60],
    'Col 2': [23,35,65,45],
    'Col 3': [85,87,90,89],

},index=["A","B","C","D"])

print(df,"\n")

輸出:

   Col 1  Col 2  Col 3
A     30     23     85
B     40     35     87
C     50     65     90
D     60     45     89

我們將使用上例中顯示的 DataFrame df 來解釋 Pandas 中 apply()map()applymap() 方法之間的區別。

pandas.DataFrame.applymap()

語法

DataFrame.applymap(func,
                    na_action=None)

它將函式 func 應用於 DataFrame 的每個元素。

示例:使用 applymap() 方法來改變 DataFrame 中的元素

import pandas as pd

df = pd.DataFrame({
    'Col 1': [30,40,50,60],
    'Col 2': [23,35,65,45],
    'Col 3': [85,87,90,89],

},index=["A","B","C","D"])

print("Initial DataFrame:")
print(df,"\n")

scaled_df=df.applymap(lambda a: a*10)

print("Scaled DataFrame:")
print(scaled_df,"\n")

輸出:

Initial DataFrame:
   Col 1  Col 2  Col 3
A     30     23     85
B     40     35     87
C     50     65     90
D     60     45     89

Scaled DataFrame:
   Col 1  Col 2  Col 3
A    300    230    850
B    400    350    870
C    500    650    900
D    600    450    890

它對 df DataFrame 中的每個元素相乘,並將結果儲存在 scaled_df DataFrame 中。我們將一個 lambda 函式作為引數傳遞給 applymap() 函式,該函式通過將輸入值與 10 相乘返回一個值。所以 DataFrame df 中的每一個元素都會被縮放為 10。

我們也可以使用 for 迴圈來迭代 df DataFrame 中的每個元素,但它使我們的程式碼可讀性降低,凌亂,效率降低。applymap() 是另一種替代方法,可以使程式碼更具可讀性和效率。

除了數學運算,我們還可以對 DataFrame 的元素進行其他操作。

import pandas as pd

df = pd.DataFrame({
    'Col 1': [30,40,50,60],
    'Col 2': [23,35,65,45],
    'Col 3': [85,87,90,89],

},index=["A","B","C","D"])

print("Initial DataFrame:")
print(df,"\n")

altered_df=df.applymap(lambda a: str(a)+".00")

print("Altered DataFrame:")
print(altered_df,"\n")

輸出:

Initial DataFrame:
   Col 1  Col 2  Col 3
A     30     23     85
B     40     35     87
C     50     65     90
D     60     45     89

Altered DataFrame:
   Col 1  Col 2  Col 3
A  30.00  23.00  85.00
B  40.00  35.00  87.00
C  50.00  65.00  90.00
D  60.00  45.00  89.00

它在 DataFrame df 中的每個元素的末尾新增 .00

Pandas 中的 map() 方法

import pandas as pd

df = pd.DataFrame({
    'Col 1': [30,40,50,60],
    'Col 2': [23,35,65,45],
    'Col 3': [85,87,90,89],

},index=["A","B","C","D"])

print("Initial DataFrame:")
print(df,"\n")

df["Col 1"]=df["Col 1"].map(lambda x: x/100)

print("DataFrame after altering Col 1:")
print(df)

輸出:

Initial DataFrame:
   Col 1  Col 2  Col 3
A     30     23     85
B     40     35     87
C     50     65     90
D     60     45     89

DataFrame after altering Col 1:
   Col 1  Col 2  Col 3
A    0.3     23     85
B    0.4     35     87
C    0.5     65     90
D    0.6     45     89

我們只能對 DataFrame 的特定列使用 map() 方法。

Pandas 中的 apply() 方法

apply() 方法改變 Pandas 中的整個 DataFrame

import pandas as pd

df = pd.DataFrame({
    'Col 1': [30,40,50,60],
    'Col 2': [23,35,65,45],
    'Col 3': [85,87,90,89],

},index=["A","B","C","D"])

print("Initial DataFrame:")
print(df,"\n")

altered_df=df.apply(lambda x: x/100)

print("Altered DataFrame:")
print(altered_df,"\n")

輸出:

Initial DataFrame:
   Col 1  Col 2  Col 3
A     30     23     85
B     40     35     87
C     50     65     90
D     60     45     89

Altered DataFrame:
   Col 1  Col 2  Col 3
A    0.3   0.23   0.85
B    0.4   0.35   0.87
C    0.5   0.65   0.90
D    0.6   0.45   0.89

apply() 方法在 Pandas 中只修改某一列

import pandas as pd

df = pd.DataFrame({
    'Col 1': [30,40,50,60],
    'Col 2': [23,35,65,45],
    'Col 3': [85,87,90,89],

},index=["A","B","C","D"])

print("Initial DataFrame:")
print(df,"\n")

df["Col 1"]=df["Col 1"].apply(lambda x: x/100)

print("DataFrame after altering Col 1:")
print(df)

輸出:

Initial DataFrame:
   Col 1  Col 2  Col 3
A     30     23     85
B     40     35     87
C     50     65     90
D     60     45     89

DataFrame after altering Col 1:
   Col 1  Col 2  Col 3
A    0.3     23     85
B    0.4     35     87
C    0.5     65     90
D    0.6     45     89

因此,從上面的例子中,我們可以看到,apply() 方法可以用來將一個特定的函式應用於整個 DataFrame 的所有元素或某一列的所有元素。

Author: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn

相關文章 - Pandas DataFrame