#はじめに
最近、プライベートでデータ分析のツールを作成している関係でpandasというpython外部ライブラリを活用している。が、いざ使って見ると、「pandas?なにそれかわいいの?」と動物のパンダ🐼を連想させるヤバい思考に行きつつある状況になる。
これはまずいと感じ、投稿者はpandasを探し求める旅に出る。
この記事は、pandasを飼いならすためにpandasをSQLっぽく考えるというデータサイエンス初学者に向けた記事となります。
#そもそもpandasとは何か
pandasとは、構造化された(表形式、多次元、潜在的に不均質)データと時系列データを簡単かつ直感的に操作できるように設計された高速で柔軟な表現力のあるデータ構造を提供するPythonパッケージで、実際的な実世界のデータ分析を行うための基本的な高レベルのビルドを行う事が可能なツールです。
要は、表データをpythonを使っていい感じに処理して目的のデータ抽出するツールです。
#実践
###準備
今回は下記の表データ【customer】を用いてpandas攻略を行います。(表データはCSV形式)
※データは長いので冒頭部分のみ表示
参考データ:データサイエンス100本ノック
https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess
また、今回はpandasを使用するため、コードは下記のように予め準備しておきます。
import pandas as pd
df_customer = pd.read_sql('customerのCSVファイルのパス', sep=',')
###本題
タイトルにある通り、今回はSQLのORDER BY句をpandasを使って再現します
問題: 顧客データフレーム(df_customer)を生年月日(birth_day)で高齢順にソートし、先頭10件を全項目表示せよ。
目的:sort_valuesメソッドを活用して、レコード(行)を降順(昇順)に整理する
###解答
解答を記述するとこんな感じになります。
df_customer.sort_values('birth_day',ascending=False).head(10)
###解説
- pandasのsort_valuesメソッドを活用する
pandasのsort_valuesメソッドを用いて、SQLに当たるORDER BY句を定義を行います。
形式を表現するとこんな感じです。
df_customer.sort_values('column',ascending=False)
sort_valuesメソッドは、まず第一引数('column')にソート対称であるカラムの指定を行います。次に、第二引数にソートを「昇べき」にするか、「降べき」にするかの是非を、ascending(昇べき)の論理値を基に決定します。(上記のコードは論理値をFalseにしているため「降べき」となっております)
- SQLで表現
上記を参考に、今回の設問をSQLで考えるとこのようになります
select * from customer ORDER BY birth_day desc LIMIT 10;
FROM句:データベース内の指定する表を選択する<
SELECT文:指定した表から抽出すべき列を選択する
LIMIT句:抽出する行数を指定する
ORDER BY句に、ソート対象のカラムを指定し(今回の場合birth_day)、その後asc(昇べき)もしくはdesc(降べき)を指定しソート条件を設定します。
また、図を表すとこんな感じになります。
- 全体図
全体をまとめると、こんな感じになります。
#まとめ
今回はpandasを使って、SQLの正規表現をまとめてみました。pandasはデータベース及びSQLを意識したpythonライブラリなため、普段からSQLを意識するとかなり使いやすいツールだと改めて感じます。また、特定の命令文を指示する時、SQLがいくつものパターンがあるように、pandasにも多様なパターンが存在すると、pandasを活用して日々実感を持ちます。
#終わりに
今回、利活用したデータはデータサイエンス協会(DS協会)の「データサイエンス100本ノック」を参考にしております。こちらはJupyter notebookを使用しているので、より見やすいデータが抽出されます。
この記事を読んで、「実際に実装してみたい!!」という方がおりましたら、下記にその実装に関する記事を上げているので、良かったそちらの記事を参考に是非実装してみて下さい。
データサイエンス初学者にむけた、データサイエンス100本ノックを実装する方法:
https://qiita.com/syuki-read/items/714fe66bf5c16b8a7407