こちらの記事では、リストに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カラムを作ることができました。