
SQLとpandasで同じ操作をする方法
2023.06.12
はじめに
業務でSQLとpandasを使う機会があり、両者で同じ操作をする際の基本的な構文の使い方を整理していきたいと思います。
pandasは、pythonのデータ解析ライブラリで具体的には下記のようなことが出来ます。
- csvやexcelなど様々な形式のファイルの入出力
- データの処理(欠損値処理・結合・ピボット・抽出)
- データの簡単なグラフ化
pandasにはデータフレームなどの独自のデータ構造があり、表形式のデータをSQLのように高速かつ、簡単に操作することが出来ます。
それでは、仮のテーブル名は「sample」として、SQL・pandasの順にコードを記述していきます。
基本的な操作
基本的な操作をささっと紹介していきます!
列選択
1 2 | SELECT col1, col2 FROM sample |
1 | sample[['col1', 'col2']] |
列追加
1 2 | SELECT *, 1 AS flg FROM sample |
1 | sample["flg"] = 1 |
列名変更
1 2 | SELECT col1 AS re_col1, col2 AS re_col2 FROM sample |
1 2 3 | sample.rename(columns={"col1": "re_col1", "score": "re_col2"}) #もしくは全カラム付け直す sample_table.columns = ["id","re_name","re_score","date"] |
条件抽出(WHERE句)
1 2 3 | SELECT * FROM sample WHERE col3 > 50; |
1 | sample[sample["col3"] > 50] |
複数条件抽出
1 2 3 | SELECT * FROM sample WHERE col3 > 50 AND col4 = 1 |
1 | sample[(sample["col3"] > 50) & (sample["col4"] == 1)] |
並び替え(ORDER BY句)
1 2 3 4 5 | SELECT * FROM sample -- デフォルトで昇順 ORDER BY col3 -- DESCを付けると降順 ORDER BY col3 DESC |
1 2 3 4 | # デフォルトで昇順 sample.sort_values("col3") # ascending=Falseで降順 sample.sort_values("col3", ascending=False) |
グループ化・条件分岐の操作
グループ化(GROUP BY)
1 2 | SELECT col5 , SUM(col6) FROM sample GROUP BY col5 |
pandasでgroupby を使うと、デフォルトでグループラベルが index になります。
index にしたく無い場合は as_index=False を指定するか
グループ化した後にreset_index()をしましょう
1 | sample[["col5","col6"]].groupby("col5", as_index=False).sum() |
条件分岐(CASE WHEN)
1 2 3 4 5 | SELECT CASE WHEN col6 >= 50 THEN 1 ELSE 0 END AS is_50over FROM sample |
1 | sample['is_50over'] = sample['col6'].map(lambda x : 1 if x >= 50 else 0) |
複数条件分岐(CASE WHEN)
1 2 3 4 5 6 7 8 | SELECT CASE WHEN col6 < 100 THEN 1 WHEN col6 >= 100 AND col6 < 200 THEN 2 WHEN col6 >= 200 AND col6 < 300 THEN 3 ELSE 4 END AS cate FROM sample |
lamda関数を使って記述することも出来ますが、複数条件の場合は関数を作った方が楽な場合が多いです。
1 2 3 4 5 6 7 8 9 10 11 | def cate(x): if x < 100: return 1 elif x >= 100 and x < 200: return 2 elif x >= 200 and x < 300: return 3 else: return 4 sample['cate'] = sample['col6'].map(cate) |
テーブル結合の操作
内部結合(INNER JOIN)
1 2 3 4 5 6 | SELECT * FROM sample1 AS s1 INNER JOIN sample2 AS s2 ON s1.col1 = s2.col1 |
1 | pd.merge(sample1, sample2, on="col1", how="inner") |
左結合(LEFT JOIN)
1 2 3 4 5 6 | SELECT * FROM sample1 AS s1 LEFT JOIN sample2 AS s2 ON s1.col1 = s2.col1 |
1 | pd.merge(sample1, sample2, on="col1", how="left") |
right joinの場合は how="right"にします。
外部結合(OUTER JOIN)
1 2 3 4 5 | SELECT * FROM sample1 AS s1 OUTER JOIN sample2 AS s2 ON s1.col1 = s2.col1 |
1 | pd.merge(sample1, sample2, on="col1", how="outer") |
書いた人はこんな人

- 8月から入社しました。安達です。
前職ではメカ設計・生産技術の業務をしておりました。
趣味はスノボとキャンプです!
日々邁進して参りますのでよろしくお願いいたします!
IT技術11月 24, 2023AWS Network Firewallを試してみた
IT技術7月 24, 2023aws初心者がSAAに合格する方法!
IT技術1月 18, 2023SQLとpandasで同じ操作をする方法