【pandas】BigQueryのデータをDataFrameで取得する方法

BigQueryに存在するテーブルをDataFrameとして取得する方法を解説しています.

公式 Reference: pandas.read_gbq

前提条件

本記事で記載しているコードを実行するにはpandasread_gbqなどのライブラリがインストールされている必要があります.

BigQueryからDataFrameを取得する

pandasのread_gbqメソッドを使用して以下のように取得できます.


import pandas as pd

# BigQueryのパブリックデータ(67.58 KB)
query = '''
SELECT
    County_of_Residence,
    Births,
    Ave_Age_of_Mother
FROM
    `bigquery-public-data.sdoh_cdc_wonder_natality.county_natality`
LIMIT
    10
'''

df = pd.read_gbq(query)

display(df.head(3))
print(df.shape)
County_of_Residence Births Ave_Age_of_Mother
0 Calhoun County, AL 1265 26.67
1 Tulsa County, OK 8933 28.13
2 Carroll County, GA 1540 27.20
(10, 3)

テーブルからデータを取得するためのクエリを用意し,それをメソッドに渡せばOKです.

注意

BigQueryは実行した操作に応じて料金がかかるため,クエリを変更する際などは注意してください.1

メソッドの主な引数

read_gbqメソッドには主に以下の引数があります.

引数 データ型 説明
project_id str アカウントのプロジェクトIDを指定.
省略時はデフォルトのプロジェクトIDが指定される.
index_col str DataFrameのindexに指定するカラムを指定.
col_order list or str DataFrameのカラム順序を指定.
dialect str 以下のいずれかを指定可能.
  • レガシーSQL: dialect='legacy'
  • 標準SQL: dialect='standard'
デフォルトはdialect='legacy'
use_bqstorage_api bool BigQuery Storage API client を使用して結果を高速に取得できる.
progress_bar_type str tqdm package のプログレスバーを表示できる.

公式ドキュメント

その他の引数などは以下の公式ドキュメントを参照

使用例:インデックス指定とカラム順序の指定

以下はindex_colcol_orderを指定した例です.


df = pd.read_gbq(query, index_col='County_of_Residence', col_order=['Ave_Age_of_Mother', 'Births'])
df.head(3)
Ave_Age_of_Mother Births
County_of_Residence
Calhoun County, AL 26.67 1265
Tulsa County, OK 28.13 8933
Carroll County, GA 27.20 1540

index_colで指定したカラムがDataFrameのindexになりcol_orderで指定した順序でカラムが表示されています.

参考

col_orderは取得するカラムをすべて指定しないとエラーになります.
また,可能ならクエリ側でカラム順序を指定した方がシンプルです.

使用例:高速化とプログレスバー表示

テーブルを高速に取得するにはuse_bqstorage_apiを使用します.
また,以下ではテーブル取得の進捗状況を表示できるprogress_bar_typeも併せて指定しています.


df = pd.read_gbq(query, use_bqstorage_api=True, progress_bar_type='tqdm')
df.head(3)
Downloading: 100%|██████████|
County_of_Residence Births Ave_Age_of_Mother
0 Calhoun County, AL 1265 26.67
1 Tulsa County, OK 8933 28.13
2 Carroll County, GA 1540 27.20

上記で取得しているテーブルは非常に小さいのでuse_bqstorage_apiを指定しなくてもストレスなくデータを取得できますが,大きいテーブルを取得する際は指定をおすすめします.2

ひとこと

BigQueryからテーブルをDataFrameとして取得してあれこれする場合にはread_gbqが便利に使えますね.
テーブルのスキーマなどの情報を得たい場合は以下の記事もご覧ください.


  1. 上記のサンプルコード(クエリ)の処理量は約68KBと少ないのでそれほど気にする必要はありません. 

  2. 指定した方が圧倒的に高速化されるので,use_bqstorage_apiが使える状況であれば積極的に使うとストレスがなくなります.