Pandas 文字列をmapで置換

要素の置換には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を使った置換も良さそう。

参考文献

このサイトの主
投稿を作成しました 98

関連投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る