LoginSignup
8
10

More than 5 years have passed since last update.

pandasqlでpandasでもSQLを使ってみる。。。?

Posted at

はじめに

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()

スクリーンショット 2019-01-19 21.31.03.png

このデータに対して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())

スクリーンショット 2019-01-19 21.39.10.png

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に慣れましょう。

8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10