はじめに
pandasでもテーブル操作ができますが、SQLに慣れている人だと操作に戸惑うと思います。
pandasでもSQLを使用できるpandasqlを使ってSQLでデータ操作してみましょう。
参考
環境
- Google Colab
- pandas==0.22.0
- pandasql==0.7.3
- seaborn==0.7.1
手順
pandasql
のインストールはpip
で出来ます。Google Colabでは元々入っていました。
$ pip install -U pandasql
デモンストレーションにはタイタニックデータを使用します。seaborn
からデータをダウンロードします。
また、pandasql
からsqldf
を読み込みます。
import pandas as pd
import seaborn as sns
from pandasql import sqldf
df = sns.load_dataset("titanic") # タイタニック号の生死者データ
データを見てみましょう。
df.head()

このデータに対してSQLを発行します。まず、SQL文を変数に格納します。
トリプルクォーテーションで囲むと改行も含めてそのままの文字列とできます。見やすさのために改行を積極的に使ったほうがよいでしょう。
FROM句にはデータフレームを記載します。
また、SQL文法はSQLite syntaxに準拠します。
q = """
SELECT *
FROM df
WHERE embarked=='S';
"""
# 下記でもOK
# q = "SELECT * FROM df WHERE embarked=='S';"
下記でSQLを実行します。
sqldf(q, locals())

bool値は数値になっていますね。。。dg = sqldf(q, locals())
でdg
にデータフレームを代入できます。
二つ目の引数にはlocals()
またはglobals()
で名前空間を指定します。
def execute_sql():
q = """
SELECT *
FROM df
WHERE embarked=='S';
"""
return sqldf(q, locals())
execute_sql()
OperationalError
となり、PandaSQLException
がレイズします。locals()
をglobals()
にすると期待通りに動きます。
その他の文もやってみよう!
UPDATE文からやってみましょう。
q = """
UPDATE df
SET survived = 1
WHERE embarked=='S';
"""
sqldf(q, locals())
OperationalError
となり、PandaSQLException
がレイズします。。。
その後調べてみましたが、どうもSELECT文しか使えないようです。joinやgroupbyはできるようですが。
また、pandasqlはリリース日がLast released: Apr 21, 2016
となっており、開発が止まっているようです。。。
おわりに
諦めてpandasに慣れましょう。