python+pandasで大規模データを扱うときのメモ

MySQLからデータを取り出す

"""Get data from MySQL with pandas library."""
import MySQLdb
import pandas.io.sql as psql

con = MySQLdb.connect(db='work', user='root', passwd='') # DB接続
sql = """SELECT product_id, product_nm, product_features FROM electronics"""
df = psql.read_sql(sql, con) # pandasのDataFrameの形でデータを取り出す
con.close()

データからベクトルを作る1

大規模データを使ってクラスタリングなどのためのベクトルを作る際、メモリ消費を抑えるためにデータを削除しながら繰り返し処理を行う。

"""Delete rows while creating dataset."""
X = []
for index, row in df.iterrows(): # 行ごとに繰り返し処理
    Xi = [row.col1, row.col2, row.col3]
    X.append(X)
    df = df.ix[index:] # メモリの消費を抑えるためにデータを削除しながらベクトルを作成

データからベクトルを作る2(速度改良)

1つめのやり方のではコードはきれいだが、繰り返しの速度が遅いという難点がある。 一度リストにするやり方の方が何倍も速い。

"""High speed row iteration in pandas DataFrame"""
# データをコピーしてリストへ
df_index, df_col1, df_col2, df_col3 = \
    list(df.index), list(df.col1), list(df.col2), list(df.col3)
del df # データを削除
for _ in df_index:
    # データを削除しながらイテレート
    col1, col2, col3 = df_col1.pop(), df_col2.pop(), df_col3.pop()
    Xi = [col1, col2, col3]
    X.append(Xi)