SQLのLIKE句を、pandas(python)のqueryメソッドのstr.contains()を使って合致するデータ抽出を行って見た

#はじめに
　最近、プライベートでデータ分析のツールを作成している関係でpandasというpython外部ライブラリを活用している。が、いざ使って見ると、「pandas?なにそれかわいいの？」と動物のパンダ🐼を連想させるヤバい思考に行きつつある状況になる。
　これはまずいと感じ、投稿者はpandasを探し求める旅に出る。
　この記事は、pandasを飼いならすために<b>pandasをSQLっぽく考えるというデータサイエンス初学者に向けた記事となります。</b>

#そもそもpandasとは何か
　pandasとは、構造化された（表形式、多次元、潜在的に不均質）データと時系列データを簡単かつ直感的に操作できるように設計された高速で柔軟な表現力のあるデータ構造を提供するPythonパッケージで、実際的な実世界のデータ分析を行うための基本的な高レベルのビルドを行う事が可能なツールです。
　<b>要は、表データをpythonを使っていい感じに処理して目的のデータ抽出するツールです。</b>

#実践
###準備
今回は下記の表データ【store】を用いてpandas攻略を行います。（表データはCSV形式）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681742/a4863ebd-480b-7a8b-db39-54df5494efea.png)

※データは長いので冒頭部分のみ表示

参考データ：データサイエンス100本ノック
https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess

また、今回はpandasを使用するため、コードは下記のように予め準備しておきます。

```python:python
import pandas as pd
df_store = pd.read_sql('storeのCSVファイルのパス', sep=',')
```

###本題
タイトルにある通り、今回は<b>SQLのLIKE句を</b>pandasを使って再現します
<br>
問題：<b>店舗データフレーム（df_store）から横浜市の店舗(address)だけ全項目表示せよ。</b>
<br>

目的：<b>条件に一致する対象行のデータ抽出する事</b>

###解答

解答を記述するとこんな感じになります。

```python:pandas(python)
df_store.query("address.str.contains('横浜市')", engine='python')
```

そして、図に表すとこんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681742/9709a481-bcfb-9df4-0df6-cdf3a7fa58ce.png)


これをSQL文で表すとこんな感じになります。

```SQL:SQL
select * from store where address LIKE '%横浜市%';
```

###解説
それでは、ここから解説していきます。

* pandasのqueryメソッドを活用する<br>
まず、pandasのqueryメソッドを用いて<b>SQLに当たるWHERE文</b>を定義します

※補足：pandasのqueryメソッドに関する詳細の記事は下記を参考にしてみて下さい。
https://qiita.com/syuki-read/items/9a57b78f6a577c2fbefe

形式を表現するとこんな感じです。

```python:pandas(python)
df_store.query('指定したい条件内容')
```

これをSQLで考えると、こんな感じになります。

```SQL:SQL
select * from store where '条件内容';
```

FROM句：データベース内の指定する表を選択する
SELECT文：指定した表から抽出すべき列を選択する

* SQLのLIKE句を、str.contains()で表現する<br>
そしてここから、pandasのqueryメソッドのstr.contains()を用いて、（SQLのLIKE句のように）対象の列(address)から条件に合致するカラムの選択を行います。str.contains()の内容を説明すると、これは()内に含まれる文字列を抽出する事を意味します。

実際に書いてみるとこんな感じになります。

```python:pandas(python)
df_store.query("address.str.contains('横浜市')", engine='python')
```

ここでは、storeテーブルのaddress列の文字列の中に「横浜市」が含まれているカラムを抽出するという事を指します。また、後ろに書いてある「engine='python'」は文字列型（str型）のメソッドではお約束事して、必要となるためこちらも忘れずに付ける事に注意しましょう。

これをSQLで考えるとこんな感じになります。

```SQL:SQL
select * from store where address LIKE '%横浜市%';
```

そして、図を表すとこんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681742/1aa702eb-7f12-dcce-d057-fc76c5632678.png)



* 全体図<br>
全体をまとめると、こんな感じになります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681742/51afa357-8f28-0837-1a4a-1d22e5e85b28.png)




###コラム
今回はstr.contains()でデータ抽出を行いましたが、文字列（str型）のデータ抽出は他にもこんなのあったりします。

<ul>
<li>str.contains(): 特定の文字列を含む</li>
<li>str.endswith(): 特定の文字列で終わる</li>
<li>str.startswith(): 特定の文字列で始まる</li>
<li>str.match(): 正規表現のパターンに一致する</li>
</ul>

データ抽出は状況によって変化するため、柔軟に使い分けていく事が大事です。

#まとめ
今回はpandasを使って、SQLのLIKE句の表現を行いました。pandasはデータベース及びSQLを意識したpythonライブラリなため、普段からSQLを意識するとかなり使いやすいツールだと改めて感じます。また、特定の命令文を指示する時、SQLがいくつものパターンがあるように、pandasにも多様なパターンが存在すると、pandasを活用して日々実感を持ちます。

#終わりに
　今回、利活用したデータはデータサイエンス協会（DS協会）の「データサイエンス100本ノック」を参考にしております。こちらはJupyter notebookを使用しているので、より見やすいデータが抽出されます。
　この記事を読んで、「実際に実装してみたい！！」という方がおりましたら、下記にその実装に関する記事を上げているので、良かったそちらの記事を参考に是非実装してみて下さい。

データサイエンス初学者にむけた、データサイエンス100本ノックを実装する方法：
https://qiita.com/syuki-read/items/714fe66bf5c16b8a7407