Categories: Python

PythonやPandasであいまい検索をする方法

この記事では、PythonやPandasであいまい検索をする方法を解説します。

あいまい検索とは、検索キーワードと完全一致せずとも同じ文字列を含むものや前方や後方が一致するものを検索する方法のことを言います。

それでは、あいまい検索をする方法を見ていきましょう!!

今回使用するデータ

今回は以下のデータを使ってあいまい検索をしてみます。

names = ['平山 真也', 
         '中澤 悦子',
         '山口 真司', 
         '奥田 一',
         '山本 美沙', 
         '堀田 修一',
         '山岸 夏美',
         '木下 恭子']

検索キーワードを含むものを取得する(部分一致)

in演算子を使うことでキーワードを含む文字列を判別することができます。

for name in names:
    if '山' in name:
        print(name)

実行結果

平山 真也
山口 真司
山本 美沙
山岸 夏美

リストとして取得したい場合は内包表記を使うと手っ取り早い。

print([name for name in names if '山' in name])

実行結果

['平山 真也', '山口 真司', '山本 美沙', '山岸 夏美']

文頭が一致するものを取得する(前方一致)

文頭がキーワードと一致するか判別するにはstr型のstartswith()メソッドを使います。

for name in names:
    if name.startswith('山'):
        print(name)

実行結果

山口 真司
山本 美沙
山岸 夏美

こちらもリストとして取得したい場合は内包表記を使う。

print([name for name in names if name.startswith('山')])

実行結果

['山口 真司', '山本 美沙', '山岸 夏美']

文末が一致するものを取得する(後方一致)

文末がキーワードと一致するか判別するにはstr型のendswith()メソッドを使います。

for name in names:
    if name.endswith('子'):
        print(name)

実行結果

中澤 悦子
木下 恭子

リストでほしいなら内包表記を使う。

print([name for name in names if name.endswith('子')])

実行結果

['中澤 悦子', '木下 恭子']

正規表現を使ったあいまい検索

正規表現は柔軟性が高いのですべてのあいまい検索が可能となっている。

import re


# 部分一致
pattern = '山'
print([name for name in names if re.search(pattern, name)])


# 前方一致
pattern = '^山'
print([name for name in names if re.search(pattern, name)])
# 前方一致の場合は re.match() でも可能
print([name for name in names if re.match(pattern, name)])


# 後方一致
pattern = '子$'
print([name for name in names if re.search(pattern, name)])

Link正規表現の書き方を学ぼう!

もし、大文字小文字関係なく検索したい場合は、flags引数にre.IGNORECASEを指定します。

import re

li = ['a', 'A']

pattern = 'a'
print([c for c in li if re.search(pattern, c, flags=re.IGNORECASE)])  # ['a', 'A']
print([c for c in li if re.search(pattern, c)])                       # ['a']

Pandasのあいまい検索

Pandasであいまい検索をすることも可能です。この章ではPandasを使うので先ほどのデータを以下のように書き換えておいてください。

import pandas as pd

names = pd.Series(['平山 真也', 
                   '中澤 悦子',
                   '山口 真司', 
                   '奥田 一',
                   '山本 美沙', 
                   '堀田 修一',
                   '山岸 夏美',
                   '木下 恭子'])

部分一致

部分一致を判定するにはstr.contains()を使います。

print(names.str.contains('山'))

実行結果

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

一致した箇所のデータを取り出したい場合は[]を使って条件を指定します。

print(names[names.str.contains('山')])

実行結果

0    平山 真也
2    山口 真司
4    山本 美沙
6    山岸 夏美
dtype: object

また、リストとして取得したい場合はto_list()を使います。

print(names[names.str.contains('山')].to_list())

実行結果

['平山 真也', '山口 真司', '山本 美沙', '山岸 夏美']

str.contains()は正規表現を使って検索することも可能となっています。

pattern = '子$'
print(names[names.str.contains(pattern)].to_list())

実行結果

['中澤 悦子', '木下 恭子']

前方一致

前方一致を判定するには、文字列型に定義されていたようなstr.startswith()を使います。

print(names[names.str.startswith('山')].to_list())

実行結果

['山口 真司', '山本 美沙', '山岸 夏美']

後方一致

後方一致を判定するには、str.endswith()を使います。

print(names[names.str.endswith('子')].to_list())

実行結果

['中澤 悦子', '木下 恭子']

まとめ

この記事では、PythonやPandasであいまい検索をする方法を解説しました。

検索キーワードと完全一致以外のデータも抽出したい場合は、ぜひともあいまい検索で要素を探してみてはいかがでしょうか?

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago