【Pandas】PostgreSQLからデータフレームに読み込む

Pandasでは様々なデータソースからのデータ連携に対応できるようにメソッドが用意されています。その中にはDBのテーブルから直接データをデータフレームに格納するメソッドもあります。

今回はPostgreSQLからSQLでSELECTしたデータをPandasデータフレームに格納する方法を紹介します。

前提

今回はローカル環境のPostgreSQLで事前に用意した学部マスタからデータを取得します。

Pythonで実装

PostgreSQLへの接続

PythonでPostgreSQLに接続するには、pcycopg2を使います。pcycopg2での操作は以下記事を参考にしてみてください。

import psycopg2

### psycopg2を使ってpostgresqlにアクセスする

def connect():
    con =  psycopg2.connect('postgresql://{user}:{password}@{host}:{port}/{dbname}'.format( 
            user="postgres",        #ユーザ
            password="postgresql",  #パスワード
            host="localhost",       #ホスト名
            port="5432",            #ポート
            dbname="studentinfo"))  #データベース名
    return con

if __name__ == '__main__':

    con = connect()

Pandasでのデータ読込

DBからSQLでデータを取得するには、pd.read_sql()を用います。第一引数に実行するSQL、第二引数にDBの接続オブジェクトを渡します。

  sql = "SELECT * FROM facultymaster"
    
  df = pd.read_sql(sql=sql, con=con)

dfにSQL実行結果のデータが格納されているので、確認してみます。

df
df

冒頭で確認した学部マスタの値を取得できています。

【参考】特定列をインデックスに指定したい場合

既存列をデータフレームのインデックスに指定したい場合は、引数index_colを追加し、インデックスにしたい列名を指定します。

df = pd.read_sql(sql=sql, con=con, index_col="facultyid")
df = pd.read_sql(sql=sql, con=con, index_col="facultyid")

コード全体

今回のコード全体のおさらいです。

import pandas as pd
import psycopg2

### psycopg2を使ってpostgresqlにアクセスする

def connect():
    con =  psycopg2.connect('postgresql://{user}:{password}@{host}:{port}/{dbname}'.format( 
            user="postgres",        #ユーザ
            password="postgresql",  #パスワード
            host="localhost",       #ホスト名
            port="5432",            #ポート
            dbname="studentinfo"))  #データベース名
    return con


if __name__ == '__main__':

    con = connect()
    
    sql = "SELECT * FROM facultymaster"
    df = pd.read_sql(sql=sql, con=con)

Pythonでデータサイエンスするなら

Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。

初学者の方にはこちらもオススメです^^

まとめ

PandasでDBからSQLで取得したデータを読み込む方法を紹介しました。

SQLで制御することで、Pandasに読み込むデータを必要最低限に抑えることができます。処理時間含め実用的な処理を実装できるので、是非実践してみてください。

ではでは👋