手軽に超高速分析!「DuckDB」を使ってPythonからCSVやParquetをSQLで操作する方法

投稿者: | 2026-08-11

皆さん、こんにちは!日々のデータ分析で「CSVファイルが大きすぎて読み込みに時間がかかる」「慣れ親しんだSQLでサクッと集計したい」と感じたことはありませんか? 今回は、そんな悩みを一瞬で解決してくれる、今大注目の組み込み型データベース「DuckDB」をご紹介します。環境構築の手間なく、まるで魔法のように高速なデータ処理を実現してみましょう!

DuckDBとは?

DuckDBは、データ分析(OLAP:オンライン分析処理)に特化した、インプロセスのリレーショナルデータベースです。SQLiteの「インストールが不要で、アプリに組み込んで手軽に使える」という便利さをそのままに、大量データの集計・分析を圧倒的な速さで行えるように設計されています。

最大の特長は、CSVやParquet、JSONといったファイルに対して、データベースに一度取り込む(インポートする)ことなく、直接SQLを実行してデータを抽出・集計できる点です。

「データ分析用のSQLite」と考えるとイメージしやすいかもしれませんね。データサイエンティストの新しい必須ツールになりつつあります!

DuckDBを導入するメリット

  • ポータビリティと手軽さ:
    `pip install duckdb`を実行するだけで準備完了です。面倒なデータベースサーバーの起動や、ユーザー権限の設定などは一切必要ありません。
  • 圧倒的な実行速度:
    「カラム(列)指向」のデータ保持と、CPUの性能を最大限に引き出す「ベクトル化クエリ実行エンジン」を採用しているため、ギガバイト級のデータでも数秒で集計が完了します。
  • 多様なファイル形式の直接クエリ:
    CSVやParquetファイルを、SQLの `FROM` 句に直接ファイルパスとして指定できます。
  • Pythonエコシステムとの親密な連携:
    PandasのDataFrameやPolarsのDataFrame、さらにはParquetファイルを、DuckDBはそのままテーブルとして認識し、SQLで操作できます。処理結果を再びPandas DataFrameとして受け取ることも簡単です。

DuckDBを使ってみよう!

今回は、簡易的なCSVファイルをその場で作って、DuckDBに直接SQLを投げてみましょう。その手軽さにきっと驚くはずです!

pip install duckdb pandas
import duckdb
import pandas as pd

# 1. テスト用のCSVファイルを作成します
data = {
    "product": ["Apples", "Bananas", "Apples", "Oranges", "Bananas", "Apples"],
    "category": ["Fruit", "Fruit", "Fruit", "Fruit", "Fruit", "Fruit"],
    "sales": [100, 150, 120, 80, 200, 110],
    "store": ["Tokyo", "Tokyo", "Osaka", "Osaka", "Osaka", "Tokyo"]
}
df_sample = pd.DataFrame(data)
df_sample.to_csv("sales_data.csv", index=False)

# 2. DuckDBを使って、CSVファイルを直接SQLでクエリします
# データベース接続を開く(メモリ内の一時的な接続)
con = duckdb.connect()

# CSVファイルを直接読み込んで、店舗ごとの売上合計と平均を計算するSQLを実行
query = """
SELECT 
    store, 
    SUM(sales) as total_sales, 
    AVG(sales) as avg_sales
FROM 'sales_data.csv'
GROUP BY store
ORDER BY total_sales DESC;
"""

# クエリを実行し、結果をPandasのDataFrameとして取得
result_df = con.execute(query).df()

print("--- 集計結果 ---")
print(result_df)
--- 集計結果 ---
   store  total_sales   avg_sales
0  Osaka        400.0  133.333333
1  Tokyo        360.0  120.000000

このコードを実行すると、DuckDBは内部で自動的にCSVのスキーマ(型)を推測し、高速に集計処理を行います。Pandasで一度全てをメモリに読み込む必要がないため、メモリ消費を大幅に節約できるのが嬉しいポイントです。

みーちゃんのワンポイント

DuckDBをPythonで使う際、最も強力なのは「Python上の変数(DataFrameなど)を、そのままSQLのテーブル名として参照できる」機能です。例えば、変数名が my_df なら、SQL文の中で SELECT * FROM my_df と書くだけで認識されます。メモリのコピーを発生させずに高速連携できるため、データの「前処理はSQLで、可視化や機械学習はPythonで」という使い分けに最適ですよ!