3.2.4
pandas で SQL を使う
まとめ
- pandas DataFrame を SQLite に変換し、SQL クエリで集計・フィルタリングを行う。
df.to_sqlでテーブル登録、pd.read_sqlで SQL 結果を DataFrame として取得する。- SQL の既存知識を活かしてデータ探索したいときや、pandas と SQL を行き来するハイブリッド分析に使う。
SQL の既存知識を活かしたい場合、pandas で整形した DataFrame を SQLite に載せ替えて SELECT や JOIN を実行するのが手っ取り早いです。ここでは in-memory DB を使った最小構成を紹介します。
| |
1. DataFrame → SQLite #
| |
:memory:を使うと一時的に DB を作成if_exists="replace"で再実行時も上書きできる- 列名にスペースがある場合は
df.columns = df.columns.str.replace(" ", "_")などで事前に正規化
2. SQL を実行 (read_sql)
#
| |
read_sql に文字列を渡すだけで DataFrame が返ってくるため、SQL と pandas を行き来しながら探索できます。
3. pandas + SQL ハイブリッド #
サブクエリで Year 列を UNPIVOT #
| |
SQLite は標準の UNPIVOT を持たないため、以下のように pandas の melt を使った結果を SQL に登録すると便利です。
| |
4. 逆方向:SQL → pandas #
データベースにあるテーブルを pandas に持ってくるときは read_sql_table / read_sql_query を使います。
| |
SQLAlchemy を用いると PostgreSQL や BigQuery など他エンジンにも同じ要領で接続できます。
運用 Tips #
SQL を資産として残す
Notebook のセルに貼り付けるだけでなく、queries/ディレクトリに.sqlファイルとして保存しておくとレビューしやすい。ビューの代わりに pandas パイプライン
df.pipe(...)でフィルタや集計を関数化しておき、SQL で取得した直後に適用する。大規模データへの拡張
測定目的なら SQLite で、実運用なら DuckDB や Polars など列志向エンジンも検討する。
チェックリスト #
- DataFrame を
to_sqlで DB 化し、read_sqlで往復するテンプレを持った - 列名・型を SQL 向けに正規化してから投入した
- Notebook とは別に
.sqlファイルを保管し、再利用できるようにした - pandas の
melt/pivotと SQL の集計を組み合わせ、得意な言語からアプローチできるようにした - 将来のデータ量増加に備えて、SQLite → DuckDB / DWH への移行経路を検討した
これで「既存の SQL クエリを pandas 上でも即座に再現する」ための土台が整いました。