
Advent Calendar 2013 - 16
Python で解析! - DataFrame 11
今回は replace を取り上げる。間違ったデータを修正したいとか、プリフィックスを付けたいとか…そんなシチュエーションを想定している。
1. データの準備
では、いつもの通りのデータの準備を。
import pandas as pd
import re
df1 = pd.DataFrame({
u'名前': [u'山田', u'鈴木', u'佐藤', u'木村'],
u'性別': [u'男', u'男', u'女', u'女'] ,
u'身長': [181, 173, 159, 164],
u'体重': [79, 71, 51, 52]
}, index=['3B005', '3B003', '3B002', '3B001'])
df2 = pd.DataFrame({
u'誕生日': ['1981/01/01', '1982/02/02', '1983/03/03', '1984/04/04']
}, index=['3B004','3B005','3B003', '3B002'])
df3 = pd.DataFrame({
u'好きなもの': [u'りんご', u'ばなな', u'いちご', u'メロン'],
}, index=['3B004','3B005','3B003', '3B001'])
df = df1.join([df2, df3])
体重 名前 性別 身長 誕生日 好きなもの
3B005 79 山田 男 181 1982/02/02 ばなな
3B003 71 鈴木 男 173 1983/03/03 いちご
3B002 51 佐藤 女 159 1984/04/04 NaN
3B001 52 木村 女 164 NaN メロン
前回のを流用していたので join しているが、今回のテーマには関係がない。
2. 文字列の置換
メロンはウォーターメロンの間違いだったということで、'すいか' に置き換えてみる。
df.replace(u'メロン', u'すいか')
体重 名前 性別 身長 誕生日 好きなもの
3B005 79 山田 男 181 1982/02/02 ばなな
3B003 71 鈴木 男 173 1983/03/03 いちご
3B002 51 佐藤 女 159 1984/04/04 NaN
3B001 52 木村 女 164 NaN すいか
まとめて英語表記にしたいなら、ディクショナリーを渡す。
df.replace({
u'メロン': u'melon',
u'いちご': u'strawberry',
u'ばなな': u'banana'
})
体重 名前 性別 身長 誕生日 好きなもの
3B005 79 山田 男 181 1982/02/02 banana
3B003 71 鈴木 男 173 1983/03/03 strawberry
3B002 51 佐藤 女 159 1984/04/04 NaN
3B001 52 木村 女 164 NaN melon
3. 正規表現で置換
正規表現も使える。試しに、プリフェックスを付けてみる。
df.replace(re.compile('^'), 'pre_')
体重 名前 性別 身長 誕生日 好きなもの
3B005 79 pre_山田 pre_男 181 pre_1982/02/02 pre_ばなな
3B003 71 pre_鈴木 pre_男 173 pre_1983/03/03 pre_いちご
3B002 51 pre_佐藤 pre_女 159 pre_1984/04/04 NaN
3B001 52 pre_木村 pre_女 164 NaN pre_メロン
これは影響範囲が大きいので、実際には列を絞って使うことになるだろう。
例のごとく、元の DataFrame には影響しない。
df
体重 名前 性別 身長 誕生日 好きなもの
3B005 79 山田 男 181 1982/02/02 ばなな
3B003 71 鈴木 男 173 1983/03/03 いちご
3B002 51 佐藤 女 159 1984/04/04 NaN
3B001 52 木村 女 164 NaN メロン
置換結果で元データを置き換えたい場合は、代入すること。
df = df.replace(re.compile('^'), 'pre_')
df
体重 名前 性別 身長 誕生日 好きなもの
3B005 79 pre_山田 pre_男 181 pre_1982/02/02 pre_ばなな
3B003 71 pre_鈴木 pre_男 173 pre_1983/03/03 pre_いちご
3B002 51 pre_佐藤 pre_女 159 pre_1984/04/04 NaN
3B001 52 pre_木村 pre_女 164 NaN pre_メロン
今回はこんなところで。