見出し画像

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でも情報を発信しています。
データ分析に興味がある、データアナリストになりたい人など、ぜひフォローお願いします!

この記事が気に入ったらサポートをしてみませんか?