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