今回は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()は前方一致、後方一致する際に楽で、可読性も高いです。
用途に応じて使い分けてください。
ではでは👋