Pandas map 徹底解説: データ変換を効率的に!
Pandasでデータ分析を行う際、Series内の各要素を別の値に変換したり、ある値に対応する別の情報を紐付けたい場面はよくあります。そのようなときに活躍するのが、Pandasの**map**メソッドです。
この記事では、Pandas mapの基本的な使い方から、効率的なデータ変換を可能にする応用テクニックまで、徹底的に解説します。
Pandas mapってどんなもの?
Pandasのmapメソッドは、**Seriesの各要素を別の値に置き換える(マッピングする)**ための機能です。主に以下の2つの方法で使われます。
辞書(Dictionary)を使ったマッピング: Seriesの要素をキーとして辞書を検索し、対応する値で置き換えます。
関数(Function)を使ったマッピング: Seriesの各要素に、指定した関数を適用し、その関数の戻り値で置き換えます。
mapはSeries専用のメソッドであり、DataFrame全体には直接適用できません(DataFrameの特定の列(Series)に対して使います)。
mapでできること
カテゴリデータの変換: 数値コードを対応するカテゴリ名に変換したり、その逆を行ったりします。
値の置換: 特定の値を別の値に置き換えます。
計算の適用: 各要素にシンプルな計算や処理を適用します。
なぜmapを選ぶべきか?
データ変換にはapplyやreplaceなど他のメソッドもありますが、mapを使うことには以下のようなメリットがあります。
簡潔なコード: 特に辞書を使ったマッピングでは、非常に短いコードで複雑な変換を実現できます。
高速性: 辞書を使ったマッピングは、内部的に最適化されており、大規模なデータセットでも高速に動作します。
applyでラムダ式を使うよりも高速な場合が多いです。明確な目的:
mapは「要素を別の値に変換する」という目的が明確なため、コードの意図が伝わりやすいです。
mapを始めるための準備
1. ライブラリのインポートとデータの準備
mapを使うためには、Pandasライブラリをインポートし、操作したいデータがSeriesとして用意されている必要があります。
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を文字列のステータス名に変換
# '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’の各要素にプレフィックスを追加
# 'ProductCode'の各要素に'PROD-'プレフィックスを追加
df['FormattedProductCode'] = df['ProductCode'].map(lambda x: 'PROD-' + x)
print("--- 'FormattedProductCode'列を追加 (関数マッピング) ---")
print(df[['ProductCode', 'FormattedProductCode']])
print("\n")
例3: 価格をカテゴリに分類
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")
mapとapply、replaceの使い分け
これらのメソッドは似ていますが、それぞれ最適な利用シーンがあります。
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**メソッドについて、その特徴、辞書と関数を使った基本的な使い方、そしてapplyやreplaceとの使い分けを徹底的に解説しました。
mapを適切に活用することで、カテゴリデータの変換、値の置換、シンプルな要素ごとの計算といったデータ前処理のタスクを、簡潔かつ高速に実行できるようになります。あなたのPandasによるデータ操作ワークフローにmapをぜひ取り入れてみてください!
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座

