nisshiee.org

個人的Pandas(Colaboratory)コードスニペット

2022-07-26

あんまりコードスニペットを書き溜めてコピペで使うのはあんまり好きじゃないんだけど、Jypyter + pandasだけは何度も「勉強する→忘れる」を繰り返していて非効率すぎるので、1年後の自分のためにある程度知識を残しておく。

コードスニペット一覧

データロードと、分析前のデータ整理

df = (
    # read_csvの時点で数値カラムはdtypeを指定しておく
    pd.read_csv(MATERIAL_FILE, dtype={"some_float_value":'float64'}, parse_dates=['created_at'])
      # ゴミ行を消す(分析作業の一工程として行を絞る作業はここではしない)
      .drop_duplicates()
      .pipe(lambda df: df[df['id'].isin(target_ids)])
      # カラム名を変更する
      .rename(columns={'srcOrientedColumnName':'analysis_oriented_column_name'})
      # 空文字はNaNに
      .replace('', np.nan)
      # indexを整備
      .set_index('id', drop=True)
)

Natural Keyの一部だけがカラムとして存在する場合のIndex整備

parent has many childrenで、children.csvが以下のようなファイルであるような場面を想定。

  • child_idが無い
  • parent_idはある
    • なので、children.csvparent_idカラムは重複がある

このときに、UniqueになるIndexを作成する。parent_idと「parent_id同一内の出現順連番」でMultiIndexにする。

(
    df.set_index('parent_id')
      .pipe(lambda df: df.assign(row=df.groupby(level=0).cumcount().astype('int8')))
      .set_index('row', append=True)
      .sort_index()
)

※ ちなみにこの処理は、前述の「データロードと、分析前のデータ整理」の「indexを整備」のステップで実施する。

GoogleDrive、CSVファイル、Googleスプレッドシートで読み書きする

koraを使うと、マウントしたGoogleDrive上のファイルやフォルダのIDを取得できる。gspreadではこのIDベースで読み書きするので入れておくと便利。

認証

2回プロンプトが出てしまうけど、良い感じの解決策はまだ見つけてない。

drive.mount('/content/drive')

auth.authenticate_user()
creds, _ = default()
gc = gspread.authorize(creds)

ディレクトリ作成

  1. マウントしたGoogleDrive上にディレクトリを作成する
  2. get_idするとまだGoogleDriveに同期されていないので、sleepしながら
  3. 再実行してもエラーにならないようにしておく
WORKSPACE_DIR = 'drive/Shareddrives/workspace'
os.makedirs(WORKSPACE_DIR, exist_ok=True)
while True:
  workspace_dir_id = get_id(WORKSPACE_DIR)
  if not workspace_dir_id.startswith('local'):
    break
  time.sleep(5)
workspace_dir_id

Googleスプレッドシートのload

spreadsheet = gc.open('ファイル名', folder_id=WORKSPACE_DIR)
worksheet = spreadsheet.worksheet('シート名')
df = pd.DataFrame(worksheet.get_all_records())

Googleスプレッドシートの作成

gspreadでは値しか書き込めないので、テンプレートを事前に作っておき、コピー&値書き込みする。
テンプレートには、見た目(ヘッダ行に色付けたり)や、入力規則なんかを設定しておくと良い。

spreadsheet = gc.copy('xxxxxxxxxx(事前にブラウザのURL欄から取得したID)', title='ファイル名', folder_id=WORKSPACE_DIR)
worksheet = spreadsheet.worksheet('シート名')
worksheet.clear()
worksheet.update([output_df.columns.values.tolist()] + output_df.values.tolist())

ファイル出力は、分析用DataFrameから最後に専用で作る

output_df = (
    analysis_df
      .reset_index()
      .fillna('')
      .loc[:, ['id','attr1','attr2']]
)

output_dfを作るセルと出力実行セルは分けておくと、再実行しやすい。

ここまで総合して、無難な初期pip install & import

!pip install kora
from google.colab import drive, auth
from google.auth import default
from kora.xattr import get_id
import gspread
import pandas as pd
import numpy as np
import os
import time