Pandasは文字列データの処理がしやすくなるよう、DataFrame.strSeries.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

空白文字を削除する

空白文字を削除する時はデフォルトで空白文字が指定されているのでそのまま使います。

右側の空白文字だけを消去したいというときや、左側の空白文字だけを消去したいという時はrstriplstripを使います。


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

rstriplstripでどういう違いが起きているかわかりにくかったと思うので、処理をした後のそれぞれの先頭の文字と最後尾の文字だけを抜き出してみます。


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関数に関しては正規表現がデフォルトで使える状態になっていたりと違いはあるので混乱しないようにしましょう。

参考