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() メソッドは DataFrame に対してのみ定義されます。同様に、apply() メソッドに関連付けられた関数は、DataFrame または Series のすべての要素に適用することができ、したがって、apply() メソッドは Series と DataFrame の両方のオブジェクトに対して定義されています。map() メソッドは、Pandas の 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)

関数 funcDataFrame の各要素に適用します。

例: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 の各要素を乗算し、その結果を scaled_df データフレームに格納します。関数 applymap() の引数に lambda 関数を渡すと、入力に 10 を掛けた値が返されます。つまり、DataFrame df のすべての要素は 10 でスケーリングされます。

for ループを使って df DataFrame の各要素を繰り返し処理することもできますが、これではコードが読みにくくなり、面倒で効率的ではありません。しかし、これではコードが読みにくくなり、煩雑になり、効率が悪くなります。

数学演算に加えて、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() メソッド

Pandas で DataFrame 全体を変更する apply() メソッド

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

Pandas で特定のカラムのみを変更する apply() メソッド

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