apply / map / applymapの違い【Python | Pandas】

はじめまして、データサイエンティストのますみです!

この記事では、PythonにおけるPandasというライブラリで表形式データに対してデータ加工をする際に使用する「apply, map, applymap」の機能を比較しました。データサイエンティストやエンジニアの方々はぜひ参考にしてください。

まとめ表

各機能を比較したまとめ表は下記の通りになります。

比較基準applymapapplymap
Series(列)への対応×
DataFrame(表)への対応×
複数引数の関数の使用××
辞書による変換××
listへの対応(組み込み関数)××

結論としては、次の通りになります。

  • 基本的には多機能な apply がおすすめ。
  • 辞書による変換を行いたい場合は map がおすすめ。
  • applymap は、全ての機能がapplyに包括されているため、使用する機会はほとんどない。

各関数の実装方法

ここからはより詳しく各機能の違いを理解するために、実装方法を示していきます。

サンプルデータの作成

まずpandasをインポートして、サンプルデータを作成します。

import pandas as pd

# サンプルデータの作成
df = pd.DataFrame({
    "name": ["A", "B", "C"],
    "nickname": ["a", "b", "c"],
})

print(df)
#namenickname
1Aa
2Bb
3Cc
作成したサンプルデータ

関数の定義

次に、これから各列もしくは表全体に対して実行する処理を関数として定義します。

add_suffix関数は、入力された文字列に対して「さん」を付与して、文字列を返す関数です。

add_suffix_custom関数は、入力された一つ目の文字列に対して、二つ目の文字列を付与して、文字列を返す関数です。

# 関数の定義(lambdaでも代替え可能)
def add_suffix(x: str) -> str:
    return x + "さん"

def add_suffix_custom(x: str, suffix: str) -> str:
    return x + suffix

1. applyのできること

applyを用いると、以下のことが実現できます。

mapとapplymapとは異なり、SeriesにもDataFrameにも両方対応している上、argsという引数に配列やタプルを渡すことで、複数の引数を関数に渡すことができます。

  • Series(列)への対応
  • DataFrame(表)への対応
  • 複数引数の関数の使用
# 1. applyのできること
df["name"].apply(add_suffix)  # Series(列)への対応
df.apply(add_suffix)  # DataFrame(表)への対応
df["name"].apply(add_suffix_custom, args=["さん"])  # 複数引数の関数の使用
#name
1Aさん
2Bさん
3Cさん
Series(列)に対して処理を実行した時の出力結果
#namenickname
1Aさんaさん
2Bさんbさん
3Cさんcさん
DataFrame(表)に対して処理を実行した時の出力結果

2. mapのできること

mapを用いると、以下のことが実現できます。

mapでは辞書を渡すことができます。そのため、対応表などが静的に決まっている場合は非常に便利です。

また、pandasからは少し話が逸れますが、組み込み関数としてmapという関数が存在するため、listに対して処理を実行することもできます。

  • Series(列)への対応
  • 辞書による変換
  • listへの対応(組み込み関数)
# 2. mapのできること
df["name"].map(add_suffix)  # Series(列)への対応
df["name"].map({"A": "Aさん", "B": "Bさん", "C": "Cさん"})  # 辞書による変換

list(map(add_suffix, df["name"].to_list()))  # listへの対応(組み込み関数)
# => ["Aさん", "Bさん", "Cさん"]
#name
1Aさん
2Bさん
3Cさん
Series(列)に対して処理を実行した時の出力結果

3. applymapのできること

applymapを用いると、以下のことが実現できます。

applymapは、全ての機能がapplyに包括されているため、使用する機会はほとんどありません。

明示的に「DataFrame全体に対して処理をしていますよ」と示したい時にのみ有効だと考えられます。

  • DataFrame(表)への対応
# 3. applymapのできること
df.applymap(add_suffix)  # DataFrame(表)への対応
#namenickname
1Aさんaさん
2Bさんbさん
3Cさんcさん
DataFrame(表)に対して処理を実行した時の出力結果

サンプルコード(全文)

import pandas as pd

# サンプルデータの作成
df = pd.DataFrame({
    "name": ["A", "B", "C"],
    "nickname": ["a", "b", "c"],
})

# 関数の定義(lambdaでも代替え可能)
def add_suffix(x: str) -> str:
    return x + "さん"

def add_suffix_custom(x: str, suffix: str) -> str:
    return x + suffix

# 1. applyのできること
df["name"].apply(add_suffix)  # Series(列)への対応
df.apply(add_suffix)  # DataFrame(表)への対応
df["name"].apply(add_suffix_custom, args=["さん"])  # 複数引数の関数の使用

# 2. mapのできること
df["name"].map(add_suffix)  # Series(列)への対応
df["name"].map({"A": "Aさん", "B": "Bさん", "C": "Cさん"})  # 辞書による変換
list(map(add_suffix, df["name"].to_list()))  # listへの対応(組み込み関数)

# 3. applymapのできること
df.applymap(add_suffix)  # DataFrame(表)への対応

最後に

最後まで読んでくださり、ありがとうございました!
いかがだったでしょうか?

この記事を通して、少しでもあなたの学びに役立てば幸いです!

おまけ

毎月10人限定ですが、若手エンジニア向けに「キャリア相談」に乗る機会を設けています。

もしも「誰かに今の悩みを聞いて欲しい」という方がいれば、気軽にお申し込みください◎

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA