Pandasは文字列データの処理がしやすくなるよう、DataFrame.str
やSeries.str
以下にPythonのstring
型データに対する関数が実装されていますが、使い方などが若干違う場合があります。
Pandas用に作られた関数も存在するので1つ1つ使い方をみていきましょう。
今回はその中でも
- いらない文字を除去する方法
- 文字の置換を行う方法
について解説していきます。
また、これらのメソッドを適用してもデータ本体の中身が入れ替わる訳ではないので注意しましょう。
前後のいらない文字を除去する方法
基本的にはstr.strip
関数を使います。strip
関数は文字列の前後にあるいらない文字を消去してくれる関数となっています。
なので、文字列の前後から指定された文字を消去していきますが、消去する対象以外の文字列が出てくると、そこで処理がストップします。
例えば、"aaabbaabbaa"
という文字列があったとします。これにstr.strip('a')
を使うと、前後の'a'
は取り除かれますが、'b'
に挟まれた'a'
は消去されず残されます。
In [1]: import pandas as pd
In [2]: a = pd.Series(['aaabbaabbaa']) # 前後の'a'だけが消される。
In [3]: a.str.strip('a')
Out[3]:
0 bbaabb
dtype: object
空白文字を削除する
空白文字を削除する時はデフォルトで空白文字が指定されているのでそのまま使います。
右側の空白文字だけを消去したいというときや、左側の空白文字だけを消去したいという時はrstrip
とlstrip
を使います。
In [4]: sr = pd.Series([' a ', ' ', ' c', 'd '])
In [5]: sr.str.strip()
Out[5]:
0 a
1
2 c
3 d
dtype: object
In [6]: sr.str.lstrip() # 左側の空白文字だけを削除
Out[6]:
0 a
1
2 c
3 d
dtype: object
In [7]: sr.str.rstrip()
Out[7]:
0 a
1
2 c
3 d
dtype: object
rstrip
とlstrip
でどういう違いが起きているかわかりにくかったと思うので、処理をした後のそれぞれの先頭の文字と最後尾の文字だけを抜き出してみます。
In [8]: sr.str.lstrip().str[:1]
Out[8]:
0 a
1
2 c
3 d
dtype: object
In [9]: sr.str.lstrip().str[-1:] # 左側から消去したので右側に当たる最後尾の空白文字は削除されていない
Out[9]:
0
1
2 c
3
dtype: object
In [10]: sr.str.rstrip().str[:1] # 右側から削除されているので空白文字がある
Out[10]:
0
1
2
3 d
dtype: object
In [11]: sr.str.rstrip().str[-1:]
Out[11]:
0 a
1
2 c
3 d
dtype: object
特定の文字を指定して消去
引数として文字列を指定すればそれぞれの文字があれば消去するといった操作になります。
例えば、以下のデータの'www.'
の部分だけを消去したい時はstr.strip('w.')
と指定すれば良いです。
In [16]: sr_2 = pd.Series(['www.example.com', 'www.sample.com'])
In [17]: sr_2.str.strip('w.')
Out[17]:
0 example.com
1 sample.com
dtype: object
特定の並びを指定して消去するのではなく、指定した文字があれば消去するという流れで処理をしていっているので柔軟な消去は難しいので、前後の空白文字を取り除く目的で使われることがほとんどです。
文字列の置換
文字列の置換にはstr.replace
関数を使います。
replace
関数では指定した文字列パターンを他の文字列で置き換えるというものです。
基本的な使い方
使い方はかなりシンプルで、置き換えたい文字列と、置換後の文字列を指定するだけです。
In [18]: sr_3 = pd.Series(['a-b-c','a-b-d','b-a-b'])
In [20]: sr_3
Out[20]:
0 a-b-c
1 a-b-d
2 b-a-b
dtype: object
このようなデータがあった時、例えば、'a-b'
という並びを'A'
に置き換えたい時は以下のように書くことができます。
In [21]: sr_3.str.replace('a-b', 'A')
Out[21]:
0 A-c
1 A-d
2 b-A
dtype: object
空白文字を消去することも可能です。
比較としてstrip
関数での挙動もみてみます。
In [22]: sr_4 = pd.Series([' a b c ', 'a b c '])
In [23]: sr_4.str.replace(' ', '') # 空白文字を消去
Out[23]:
0 abc
1 abc
dtype: object
In [24]: sr_4.str.strip() # 前後の空白文字だけを消去
Out[24]:
0 a b c
1 a b c
dtype: object
正規表現を使った置換
Pandasのreplace関数では正規表現を使って値の置換を行うことができます。デフォルトで正規表現として読み込むようになっています。
In [25]: sr_5 = pd.Series(['A', 'B', '1234bde45'])
In [26]: sr_5.str.replace('^[1-9]', 'A') # 先頭に数字があれば置換
Out[26]:
0 A
1 B
2 A234bde45
dtype: object
In [27]: sr_5.str.replace('^[1-9]+', 'A') # 先頭から続く数値全部を置換
Out[27]:
0 A
1 B
2 Abde45
dtype: object
これらの正規表現で使うメタ文字を消去したい時はregex=False
とするとうまく動作します。
In [31]: sr_6 = pd.Series(['[1-9]'])
In [32]: sr_6.str.replace('[1-9]','number') # このままだと1と9をそれぞれ置換してしまう
Out[32]:
0 [number-number]
dtype: object
In [33]: sr_6.str.replace('[1-9]','number', regex=False)
Out[33]:
0 number
dtype: object
まとめ
今回は前後の空白文字を削除するために主に使われるstrip
関数と文字列の置換を行うreplace
関数の使い方について解説しました。
基本的な使い方はPythonの組み込みのものとあまり変わりないですが、replace
関数に関しては正規表現がデフォルトで使える状態になっていたりと違いはあるので混乱しないようにしましょう。