【Pandas】Seriesで文字列をあいまい検索する

今回はPandasのSeriesで文字列のあいまい検索をする方法を紹介します。あいまい検索にもいくつか種類があり、Pandasでは部分一致、前方一致、後方一致で検索が可能です。

使用するデータ

あいまい検索をする対象のSeriesを用意します。今回はフルーツの名前を10個集めたSeriesを作成します。

import pandas as pd

# サンプルのSeriesを作成
data = pd.Series(['apple', 
                  'banana', 
                  'GRAPE', 
                  'orange', 
                  'kiwi', 
                  'melon', 
                  'strawberry', 
                  'pineapple', 
                  'mango', 
                  'pear'])

部分一致

部分一致で検索する場合は、str.contains()を使います。’a’を含むかを判定するには以下のようにします。

data.str.contains('a')

>>
0     True
1     True
2    False
3     True
4    False
5    False
6     True
7     True
8     True
9     True
dtype: bool

Seriesから部分一致で当てはまる要素を取得するには以下のようにします。

data[data.str.contains('a')]

>>
0         apple
1        banana
3        orange
6    strawberry
7     pineapple
8         mango
9          pear
dtype: object

正規表現

str.contains()はデフォルトで正規表現での検索が有効になっています。

data.str.contains('^a')

>>
0     True
1    False
2    False
3    False
4    False
5    False
6    False
7    False
8    False
9    False
dtype: bool

^や?や*など正規表現に使われる文字も検索文字として扱いたい場合はregex=Falseにする必要があります。

以下だと、appleも対象外になります。

data.str.contains('^a', regex=False)

>>
0    False
1    False
2    False
3    False
4    False
5    False
6    False
7    False
8    False
9    False
dtype: bool

大文字と小文字

デフォルトでは大文字と小文字は区別して判定されます。今回”GRAPE”だけ大文字にしているのですが、data.str.contains(‘a’)だとFalseになっています。

大文字と小文字の区別をなくすには、case=Falseとする必要があります。

data.str.contains('a', case=False)

>>
0     True
1     True
2     True
3     True
4    False
5    False
6     True
7     True
8     True
9     True
dtype: bool

前方一致

前方一致で検索する場合、str.startswith()を使います。

data.str.startswith("a")

>>
0     True
1    False
2    False
3    False
4    False
5    False
6    False
7    False
8    False
9    False
dtype: bool

str.startswith()は正規表現を使うことができず、指定した値がそのまま検索されます。正規表現のパラメータregexもありません。また、大文字と小文字は区別され、区別しないようにすることもできません。

data.str.startswith("^a")

>>
0    False
1    False
2    False
3    False
4    False
5    False
6    False
7    False
8    False
9    False
dtype: bool

後方一致

後方一致で検索する場合、str.endswith()を使います。

data.str.endswith("e")

>>
0     True
1    False
2    False
3     True
4    False
5    False
6    False
7     True
8    False
9    False
dtype: boo

str.startswith()と同様に正規表現を使うことができず、指定した値がそのまま検索されます。正規表現のパラメータregexもありません。また、大文字と小文字は区別され、区別しないようにすることもできません。

まとめ

PandasのSeriesで文字列のあいまい検索をする方法を紹介しました。contains()では正規表現も使用できて可用性が高いですが、startswith()やendswith()は前方一致、後方一致する際に楽で、可読性も高いです。

用途に応じて使い分けてください。

ではでは👋