Pandasを用いたデータ分析において、データフレームやシリーズの各要素に対して特定の処理を一括で適用したい場面は非常に多く存在します。
効率的なコードを書くためには、applyやmapといったメソッドの性質を正しく理解し、適切に使い分けることが不可欠です。
本記事では、2026年現在の最新のPandas仕様に基づき、これらのメソッドの使い分け方や、処理速度を向上させるための実践的なテクニックを詳しく紹介します。
初心者の方から実務でデータ処理を行うエンジニアの方まで、データの加工効率を一段階引き上げるための知識を整理していきましょう。
mapメソッドの使い方と主な役割
mapメソッドは、主にSeries(シリーズ)の各要素に対して、別の値をマッピングしたり関数を適用したりするために使用されます。
特に、特定の値を別の値に置換する場合や、辞書データを用いて値を変換する場合に非常に強力なツールとなります。
辞書を用いた値の置換
もっとも一般的な使い方は、辞書オブジェクトを引数に渡して、特定のキーに対応する値へ一括変換する手法です。
例えば、性別を示す「male」「female」という文字列を「0」「1」という数値に変換する際に役立ちます。
import pandas as pd
# サンプルデータの作成
s = pd.Series(['cat', 'dog', 'rabbit', 'cat'])
# 辞書によるマッピング
mapping = {'cat': 'ねこ', 'dog': 'いぬ', 'rabbit': 'うさぎ'}
result = s.map(mapping)
print(result)
0 ねこ
1 いぬ
2 うさぎ
3 ねこ
dtype: object
この手法の利点は、コードが直感的であり、置換ルールが明確に定義できる点にあります。
Seriesに対する関数の適用
mapは辞書だけでなく、関数を引数に取ることも可能です。
ただし、基本的には「1つの要素を受け取って1つの値を返す」シンプルな処理に向いています。
# 各要素の文字数をカウントする例
s = pd.Series(['apple', 'banana', 'cherry'])
result = s.map(len)
print(result)
0 5
1 6
2 6
dtype: int64
applyメソッドの使い方と柔軟なデータ操作
applyメソッドは、mapよりも汎用性が高く、SeriesだけでなくDataFrame(データフレーム)に対しても使用できるのが特徴です。
複雑なロジックを持つ関数を適用したり、行や列の単位で計算を行ったりする場合には、applyを選択します。
Seriesにおけるapplyの利用
Seriesに対してapplyを使用する場合、動作はmapと似ていますが、引数に関数を渡す際のオプションがより豊富です。
# ラムダ式を用いた処理
s = pd.Series([10, 20, 30])
result = s.apply(lambda x: x ** 2)
print(result)
0 100
1 400
2 900
dtype: int64
DataFrameにおけるapplyの利用(行・列単位)
applyの真骨頂は、DataFrame全体に対して特定の軸(行または列)に沿って関数を適用できる点にあります。
引数axisを指定することで、列ごとに処理をするか、行ごとに処理をするかを制御できます。
df = pd.DataFrame({
'Math': [80, 90, 70],
'English': [85, 95, 60]
})
# 行ごとの合計点(横方向の計算)を算出
df['Total'] = df.apply(lambda row: row['Math'] + row['English'], axis=1)
print(df)
Math English Total
0 80 85 165
1 90 95 185
2 70 60 130
このように、複数のカラムの値を組み合わせて新しい値を生成する場合、applyは欠かせない存在です。
DataFrameの各要素に適用するmap(旧applymap)
以前のPandasでは、DataFrameの全要素に対して要素単位で関数を適用するメソッドとしてapplymapが使われていました。
しかし、近年のアップデートによりapplymapは非推奨となり、現在はDataFrameに対してもmapメソッドを使用することが推奨されています。
df = pd.DataFrame({
'A': [1.234, 2.345],
'B': [3.456, 4.567]
})
# 全要素を小数点第1位で丸める
result = df.map(lambda x: round(x, 1))
print(result)
A B
0 1.2 3.5
1 2.3 4.6
これにより、SeriesでもDataFrameでも「要素ごとの変換」はmapに統一され、より分かりやすいインターフェースとなりました。
mapとapplyの使い分け基準
メソッドの選択に迷った際は、以下の比較表を参考にしてください。
| メソッド名 | 適用対象 | 主な用途 | 特徴 |
|---|---|---|---|
| map | Series / DataFrame | 要素単位の置換・変換 | 辞書によるマッピングが可能。要素ごとの処理に特化している。 |
| apply | Series / DataFrame | 複雑な関数適用・集計 | 行(axis=1)や列(axis=0)単位での高度な操作が可能。 |
基本的には、「単純な変換ならmap、構造的な操作ならapply」と覚えておくとスムーズです。
パフォーマンスを意識した実践的なアドバイス
applyやmapは便利なメソッドですが、Pythonのループを内部で実行しているため、データ量が数百万行を超えるようなケースでは処理速度が低下することがあります。
パフォーマンスを最大化するためには、可能な限り「ベクトル化された演算」を優先して使用しましょう。
ベクトル化演算の例
例えば、数値を2倍にする処理を書く場合、applyを使うよりもPandas標準の算術演算子を直接使うほうが圧倒的に高速です。
# applyを使う(遅い可能性がある)
df['val'] = df['val'].apply(lambda x: x * 2)
# ベクトル化演算を使う(非常に高速)
df['val'] = df['val'] * 2
データの規模が小さい場合は差が顕著ではありませんが、大規模なデータセットを扱う実務においては、この違いが数分の処理待ち時間の差となって現れます。
どうしてもベクトル化できない複雑な条件分岐が含まれる場合にのみ、applyを使用するというスタンスが推奨されます。
まとめ
Pandasにおけるmapとapplyは、どちらもデータ加工に欠かせない強力なメソッドです。
mapは要素ごとの変換や辞書を用いた置換に最適であり、DataFrame全体への適用も可能です。
一方でapplyは、行や列を跨いだ計算や、より柔軟なロジックを組み込む際にその真価を発揮します。
2026年のデータ分析現場では、これらの使い分けに加えて、処理速度を考慮したベクトル化演算の併用が標準的なスキルとして求められています。
まずは本記事で紹介した基本パターンをマスターし、状況に応じて最適なメソッドを選択できるよう練習を積みましょう。
適切なメソッド選択ができるようになれば、あなたのデータ分析コードはより読みやすく、そして効率的なものへと進化するはずです。
