Pandas apply, map 和 applymap 的區別

Suraj Joshi 2023年1月30日
  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 的所有元素或某一列的所有元素。

作者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn

相關文章 - Pandas DataFrame