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_メロン

今回はこんなところで。