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