要素の置換にはreplaceがまず浮かぶが、mapの方が高速で置換することができる(らしい)。
辞書を使った置換操作
mapの場合、辞書を使った置換ができる。これはapplyではできない。
import pandas as pd
df = pd.DataFrame({'ID': [1, 2, 3, 3, 4, 5, 5],
'Name': ['Noto', 'Hisakawa', 'Kouda', 'Hayashibara', 'sakamoto', 'tamura', 'mitsuishi'],
'score':[100, 50, 80, 50, 100, 70, 55]})
df
ID Name score
0 1 Noto 100
1 2 Hisakawa 50
2 3 Kouda 80
3 3 Hayashibara 50
4 4 sakamoto 100
5 5 tamura 70
6 5 mitsuishi 55
データフレームではなく、シリーズを対象に置換する。シリーズ以外に適用すると、エラーで怒られる。
df['Name'].map({'tamura': 'Yukarin',
'sakamoto': 'Maaya',
'mitsuishi': 'kotochawan'})
0 NaN
1 NaN
2 NaN
3 NaN
4 Maaya
5 Yukarin
6 kotochawan
Name: Name, dtype: object
注意しないといけないのは、置換対象が存在しない要素はNaNに置換されてしまうこと。
replaceの場合は元の要素が維持される点で異なる。もし置換対象でないものも残したい場合は下記のようにupdateを咬ませて回避策をとる。
df.update(df['Name'].map({'tamura': 'Yukarin', 'sakamoto': 'Maaya', 'mitsuishi': 'kotochawan'}))
df
ID Name score
0 1 Noto 100
1 2 Hisakawa 50
2 3 Kouda 80
3 3 Hayashibara 50
4 4 Maaya 100
5 5 Yukarin 70
6 5 kotochawan 55
updateは何も指定しなくてもinplace=True的な動きをする。そのため、もとのシリーズが上書きされてしまうので注意。
というわけで、データの整形などで置換が必要になる場合(一部の要素だけ置換し、その他の要素はそのままにしておきたい)はreplaceに辞書を指定した方が楽。
aisho = {'tamura': 'Yukarin',
'sakamoto': 'Maaya',
'mitsuishi': 'kotochawan'}
df["Name"].replace(aisho, inplace=True)
df
ID Name score
0 1 Noto 100
1 2 Hisakawa 50
2 3 Kouda 80
3 3 Hayashibara 50
4 4 Maaya 100
5 5 Yukarin 70
6 5 kotochawan 55
置換する文字の辞書がデータをすべて網羅するような場合なら、mapを使った置換も良さそう。