Pandas map 徹底解説: データ変換を効率的に!


 

Pandasでデータ分析を行う際、Series内の各要素を別の値に変換したり、ある値に対応する別の情報を紐付けたい場面はよくあります。そのようなときに活躍するのが、Pandasの**map**メソッドです。

この記事では、Pandas mapの基本的な使い方から、効率的なデータ変換を可能にする応用テクニックまで、徹底的に解説します。


 

Pandas mapってどんなもの?

 

Pandasのmapメソッドは、**Seriesの各要素を別の値に置き換える(マッピングする)**ための機能です。主に以下の2つの方法で使われます。

  1. 辞書(Dictionary)を使ったマッピング: Seriesの要素をキーとして辞書を検索し、対応する値で置き換えます。

  2. 関数(Function)を使ったマッピング: Seriesの各要素に、指定した関数を適用し、その関数の戻り値で置き換えます。

mapはSeries専用のメソッドであり、DataFrame全体には直接適用できません(DataFrameの特定の列(Series)に対して使います)。

 

mapでできること

 

  • カテゴリデータの変換: 数値コードを対応するカテゴリ名に変換したり、その逆を行ったりします。

  • 値の置換: 特定の値を別の値に置き換えます。

  • 計算の適用: 各要素にシンプルな計算や処理を適用します。


 

なぜmapを選ぶべきか?

 

データ変換にはapplyreplaceなど他のメソッドもありますが、mapを使うことには以下のようなメリットがあります。

  • 簡潔なコード: 特に辞書を使ったマッピングでは、非常に短いコードで複雑な変換を実現できます。

  • 高速性: 辞書を使ったマッピングは、内部的に最適化されており、大規模なデータセットでも高速に動作します。applyでラムダ式を使うよりも高速な場合が多いです。

  • 明確な目的: mapは「要素を別の値に変換する」という目的が明確なため、コードの意図が伝わりやすいです。


 

mapを始めるための準備

 

 

1. ライブラリのインポートとデータの準備

 

mapを使うためには、Pandasライブラリをインポートし、操作したいデータがSeriesとして用意されている必要があります。

Python
 
import pandas as pd

# サンプルデータフレームの作成
data = {
    'UserID': [101, 102, 103, 104, 105],
    'StatusID': [1, 2, 1, 3, 2], # 1: Active, 2: Inactive, 3: Pending
    'ProductCode': ['A1', 'B2', 'C3', 'A1', 'B2'],
    'Price': [1000, 1500, 800, 1200, 2000]
}
df = pd.DataFrame(data)

print("--- 元のデータフレーム ---")
print(df)
print("\n")

 

mapの基本的な使い方

 

 

1. 辞書を使ったマッピング

 

Seriesの要素(キー)に対応する値を辞書から検索し、置き換えます。

 

例1: 数値のステータスIDを文字列のステータス名に変換

 

Python
 
# 'StatusID'を対応するステータス名に変換
status_map = {
    1: 'Active',
    2: 'Inactive',
    3: 'Pending'
}
df['StatusName'] = df['StatusID'].map(status_map)

print("--- 'StatusName'列を追加 (辞書マッピング) ---")
print(df[['UserID', 'StatusID', 'StatusName']])
print("\n")

辞書に存在しないキーの要素は、デフォルトでNaNになります。

 

2. 関数を使ったマッピング

 

Seriesの各要素に、指定した関数を適用し、その関数の戻り値で置き換えます。これは、applyをSeriesに使う場合とほぼ同じ振る舞いをしますが、mapの方がコードの意図がより明確になることがあります。

 

例2: ‘ProductCode’の各要素にプレフィックスを追加

 

Python
 
# 'ProductCode'の各要素に'PROD-'プレフィックスを追加
df['FormattedProductCode'] = df['ProductCode'].map(lambda x: 'PROD-' + x)

print("--- 'FormattedProductCode'列を追加 (関数マッピング) ---")
print(df[['ProductCode', 'FormattedProductCode']])
print("\n")

 

例3: 価格をカテゴリに分類

 

Python
 
def classify_price(price):
    if price >= 1500:
        return 'High'
    elif price >= 1000:
        return 'Medium'
    else:
        return 'Low'

df['PriceCategory'] = df['Price'].map(classify_price)

print("--- 'PriceCategory'列を追加 (カスタム関数マッピング) ---")
print(df[['Price', 'PriceCategory']])
print("\n")

 

mapapplyreplaceの使い分け

 

これらのメソッドは似ていますが、それぞれ最適な利用シーンがあります。

  • map():

    • Series専用

    • 1対1の要素変換に最適。

    • 辞書、または各要素に適用する関数(ラムダ式含む)を使用。

    • 特に辞書によるマッピングは高速。辞書に存在しないキーはNaNになる。

  • apply():

    • Series、DataFrameの両方に適用可能。

    • より複雑なロジックや、複数の列の値を参照して新しい値を生成する場合(DataFrameのaxis=1)に特に強力。

    • Seriesに対して使う場合はmapと似た挙動だが、mapの方が辞書マッピングに特化している分、意図が明確で高速な場合がある。

  • replace():

    • Series、DataFrameの両方に適用可能。

    • 特定の値を別の特定の値に置き換えたい場合に最適。リストや辞書で複数の置換ルールを指定できる。

    • mapのように全要素を変換するのではなく、指定した値だけを置き換える

簡単な例での使い分け:

  • df['gender'].map({'M': 'Male', 'F': 'Female'}): 性別コードの変換に最適(辞書)。

  • df['age'].apply(lambda x: 'Adult' if x >= 18 else 'Child'): 年齢でカテゴリ分け(より複雑な条件分岐)。

  • df['status'].replace(99, 'Unknown'): 特定の数値コードを文字列に置換。


 

まとめ

 

この記事では、PandasでSeriesの要素を効率的に変換する**map**メソッドについて、その特徴、辞書と関数を使った基本的な使い方、そしてapplyreplaceとの使い分けを徹底的に解説しました。

mapを適切に活用することで、カテゴリデータの変換、値の置換、シンプルな要素ごとの計算といったデータ前処理のタスクを、簡潔かつ高速に実行できるようになります。あなたのPandasによるデータ操作ワークフローにmapをぜひ取り入れてみてください!

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座