SQL使えるならPandasもやれ! ~SQLとPandasの対応一覧~
こんにちは、コグラフ株式会社データアナリティクス事業部の平松です。
今回はデータ分析で使われるSQLとPythonライブラリの一つPandasの比較をしていきたいと思います。
SQLとは
データベース言語の一つで、データベース言語とは「データベースを操作するための言語」のことです。データベースにデータを格納したり、書き換えることができます。データの前処理、膨大なデータの効率的な取得・集計・追加・削除・更新などができます。データを整形するうえで欠かせない言語です。
Pandasとは
Pandasとは、Pythonでデータ分析を効率的に行うためのライブラリです。
機械学習やデータ分析を行う際、データが整理されておらず、分析ができないことがあります。そこでPandasを用いると、分析可能な状態までデータを整理・整形がすることができます。
加えて、統計学の基礎的な部分である、分散、標準偏差、分位数なども簡単に表現できます。
SQLとPandasの比較
SQLはデータの整形・整理には特化ているが、データ分析に関しては充実していません。
対してPandasは、記述統計レベルのデータ分析は容易にできます。
自由度も高く、データの整形整理も可能ですが、その点はSQLの方がとっつきやすく、容易にできます。
どちらも長所短所があるので、使い分けることをお勧めします。
では、クエリとコードの表現方法の違いを説明するため、早速内容に入っていきたいと思います。
カラムの選択
/*SQL*/
SELECT
column1,
column2
FROM
table;
/*Pandas*/
df[['column1','column2']]
カラム名の変更
column1をcol1、column2をcol2に変更
/*SQL*/
SELECT
column1 AS col1,
column2 AS col2
FROM
table;
※Pandasの場合はdataframeのカラム名を変更
/*Pandas*/
df.rename(columns={'column1': 'col1', 'column2': 'col2'})
条件抽出(AND、IN、OR、NOT)
AND:column1がりんごで、かつ、column2が50以上
/*SQL*/
SELECT
column1,
column2
FROM
table
WHERE
column1 = 'apple'
AND column2 >= 50;
/*Pandas*/
df[(df['column1']=='apple') & (df['column2']>=50)]
IN:column1がりんご、または、みかん
/*SQL*/
SELECT
column1,
column2
FROM
table
WHERE
column1 IN ('apple','orange');
/*Pandas*/
df[(df['column1'].isin(['apple','orange'])),column2]
OR:column1がりんご、または、column2が50以上
/*SQL*/
SELECT
column1,
column2
FROM
table
WHERE
column1 = 'apple'
OR column2 >= 50;
/*Pandas*/
df[(df['column1']=='apple') | (df['column2']>=50)]
NOT:column1がりんごでない
/*SQL*/
SELECT
column1,
column2
FROM
table
WHERE
column1 <> 'apple'
/*Pandas*/
df[df['column1'] != 'apple']
件数制限
10行目~100行目までを表示
/*SQL*/
SELECT
column1,
column2
FROM
table
LIMIT 10,100;
/*Pandas*/
df.iloc[10:100]
カウント
列をカウント(NULLを含まない)
/*SQL*/
SELECT
COUNT(column1)
FROM
table;
/*Pandas*/
df['column1'].count()
ユニークなカウント
/*SQL*/
SELECT
COUNT(DISTINCT column1)
FROM
table;
/*Pandas*/
df['column1'].nunique()
グループごとにカウント
column1ごとに集計
/*SQL*/
SELECT
column1,
COUNT(*)
FROM
table
GROUP BY
column1;
/*Pandas*/
df.groupby('column1').count()
NULLの削除
/*SQL*/
SELECT
column1,
column2
FROM
table
WHERE
column1 IS NOT NULL;
/*Pandas*/
df['column1'].dropna()
並び替え
/*SQL*/
SELECT
column1
FROM
table
ORDER BY
column1 DESC;
/*Pandas*/
df['column1'].sort_values(ascending=False)
集約関数(合計、平均)
column1の合計
/*SQL*/
SELECT
SUM(column1)
FROM
table;
/*Pandas*/
df['column1'].sum()
column1の平均
/*SQL*/
SELECT
AVG(column1)
FROM
table;
/*Pandas*/
df['column1'].mean()
テーブル結合
片側外部結合
/*SQL*/
SELECT
column1,
column2,
column3
FROM
table
LEFT JOIN
table2
ON
table.column1 = table2.column3
/*Pandas*/
df = pd.Dataframe(data=[column1,column2])
df2 = pd.Dataframe(data=column3)
df = pd.concat([df,df2],axis=1)
#pd = pandas
内部結合
/*SQL*/
SELECT
column1,
column2,
column3
FROM
table
INNER JOIN
table2
ON
table.column1 = table2.column3
/*Pandas*/
df = pd.Dataframe(data=[column1,column2])
df2 = pd.Dataframe(data=column3)
df = df.merge(df2, how='inner', left_on='column1', right_on='column3')
Twitterもやってます!
コグラフデータ事業部ではTwitterでも情報を発信しています。
データ分析に興味がある、データアナリストになりたい人など、ぜひフォローお願いします!