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(表)への対応

最後に

いかがだったでしょうか?
この記事を通して、少しでもあなたの困りごとが解決したら嬉しいです^^

📩 仕事の相談はこちら 📩

お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。
問い合わせフォームはこちら

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。
info*galirage.com(*を@に変えてご送付ください)

🎁 「生成AIの社内ガイドライン」PDFを『公式LINE』で配布中 🎁
「LINEで相談したい方」や「お問い合わせを検討中の方」は、公式LINEでご連絡いただけますと幸いです。
(期間限定で配信中なため、ご興味ある方は、今のうちに受け取りいただけたらと思います^^)
公式LINEはこちら

🚀 新サービス開始のお知らせ 🚀

新サービス 「AI Newsletter for Biz」 がスタートしました!

ビジネスパーソン向けに「AIニュース」を定期配信する完全無料のニュースレターです📩

ますみが代表を務める「株式会社Galirage」では、「生成AIを用いたシステムの受託開発(アドバイス活動含む)」をしています。

そこでお世話になっているお客様に対して、「最新トレンドを加味したベストな提案」をするために、日々最新ニュースを収集する仕組みを構築していました。

今回は、そこで構築した仕組みを活用して、より多くの人に有益な情報を届けたいと思い、本サービスを開始しました!

一人でも多くの方にとって、「AI人材としてのスキルアップ」につながれば幸いです^^

▼ 登録はこちらから ▼
https://bit.ly/ai_newsletter_for_biz_ai_lab

コメントを残す

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

CAPTCHA