Python PR

Pandasでmapメソッドやapplyメソッドを使う。lambda式もあり。

記事内に商品プロモーションを含む場合があります

こちらの記事では、リストにmap関数を適用し、リストの中身を一括で変換する方法について言及しました。

map関数でリストの中身を一括変換する。lambda式もあり。Kaggleで写経をしていると、map関数を使っている場面によく遭遇します。map関数ってどうやって使えるのでしょうか? map(関数...

この記事では、リストではなくてPandasのデータに同様の処理をする方法について紹介します。

kaggleのタイタニック号のデータを使って説明します。まずは、データをdataframeの形で読み込みます。

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

train = pd.read_csv('train.csv')
train.head()

mapとapplyの違い

mapとapplyの使い分けをまとめると次のようになります。

1)mapはSeriesのみに対応、applyはSeriesでなくても良い。例えば、カラム1つに適用するならmap、applyのどちらもよいが、カラム2つ以上に一括適用するならapplyのみ。

2)mapは辞書で変換できる。applyではできない。

3)リストに対してはmapしか使えない。

dataframeのカラム1つにmapメソッドを適用する

dataframeのカラムにmapメソッドを適用するときは、こんな書き方をします。リストに対する書き方とはやや異なります。

例えば、乗客の年齢(Age)を1つ増やす場合。

def next_year(x):
    return x+1

train['next_year_Age'] = train['Age'].map(next_year)
train.head()

dataframeの右端に、年齢+1のカラム「next_year_Age」ができました。

リストの場合はmap(関数, リスト)という関数形式でコードを書きますが、pandasのSeriesに対しては、Series.map(関数)というメソッド形式でコードを書きます。

applyメソッドでも同じ処理ができる

mapではなく、applyにしても同じ処理ができます。

def next_year(x):
    return x+1

train['next_year_Age'] = train['Age'].apply(next_year)
train.head()

lambda式を使えば、わざわざ関数を定義しなくて済む

また、lambda式を使えば、わざわざdefで関数を定義せずとも同じことができます。

train['next_year_Age'] = train['Age'].map(lambda x:x+1)
train.head()
train['next_year_Age'] = train['Age'].apply(lambda x:x+1)
train.head()

mapメソッドに限り、辞書を使った変換ができる

mapメソッドだと、辞書を使った変換ができます。これはapplyメソッドではできません。

例えば、乗客の性別(Sex)が女性(female)の場合は0、男性(male)の場合は1とします。性別を0か1かで示すカラム(Sex_Number)を新たに作るにはこのようなコードを書きます。

train["Sex_Number"] = train["Sex"].map({"female":0, "male":1})
train.head()

dataframeの右端に、Sex_Numberカラムを作ることができました。