Pandas Tips

はじめに

春になりました。花粉症の季節ですね。

杉林が目の前にあるので、見てるだけでつらたんです。

今日は業務で使ったPandasの便利なTipsを2つ紹介します。

Tips_1

やりたいこと

RDBのIDをULIDで置き換えたい。(外部キーで保持しているもの含め)

考えたこと

  • 外部キーで利用しているIDをすべて置き換えなければならない
  • SQLではめんどくさそう。できるのか?
  • dictでIDとULIDを作成してしまえば問題ない

試行錯誤の結果

  1. 一旦既存のプライマリーキーを保持しているテーブルのすべてのIDをULIDとのペアをcsvとして書き出し
  2. 書き出したcsvをDataFrameとして読み込んでdictとして保持
  3. DataFrameに適用

上記で解決できました。地道にコーディングすると大変ですが、DataFrameで読み込めると応用が効いて大変便利でした。

該当コード

1import pandas as pd
2from ulid import ULID
3
4# プライマリーキーにidを持つテーブルのcsv(table_1.csv)を読み込む
5table_1 = pd.read_csv('./input/table_1.csv', dtype=str)
6
7# 一旦csvとULIDのペアで保存もしておく
8table_1_ids = pd.DataFrame()
9table_1_ids['table_1_id'] = table_1['id']
10table_1_ids['ulid'] = [str(ULID()) for i in range(0, len(table_1['id']))]
11table_1_ids.to_csv('./output/table_1_ids.csv', index=False)
12
13# table_2(table_1のidを外部キーとしてもつ)を読み込み
14table_2 = pd.read_csv('./input/table_2.csv', dtype=str)
15
16# table_1_idsのDataFrameをdictに変換
17table_1_dict = table_1_ids.set_index('table_1_id')['ulid'].to_dict()
18
19# table_2のDataFrameにdictを適用
20table_2['table_1_ulid'] = table_2['table_1_id'].map(table_1_dict)

Tips_2

やりたいこと

例として「注文」と「顧客」という2つのテーブルがあったとします。

  • 顧客テーブル(親テーブル):顧客ID、顧客名などの情報
  • 注文テーブル(子テーブル):注文ID、顧客ID、注文日などの情報

「注文テーブル」の各注文は、「顧客テーブル」の特定の顧客に関連付けられています。

やりたいことは、

  • 各顧客が何件の注文をしているかを顧客テーブルに付与したい(すでにテーブルは存在していて初期値としてcountを設定する)

考えたこと

  • 注文テーブルで顧客IDごとにgroup by してcountを算出して、それを顧客テーブルの属性に追加
  • できそうだが簡単にやりたい

試行錯誤の結果

  1. 普通にPandasのgroupby, transformを利用

実際には、データの前処理やった後に、離れた階層のカウントが必要だったので、何度か繰り返して算出しました。

便利な関数が揃っているPandasですね。それと実行速度がSQLより早くていつもびっくりします(繰り返し処理でなくベクトル演算だから?)。実務では3,000万件スケールのデータで処理しました。

該当コード

1import pandas as pd
2source['count'] = source.groupby('target_id')['target_id'].transform('count')

まとめ

最近はDBのデータの整合性確認や、初期データの作成などにPandasをよく利用します。
毎回関数の利用方法は忘れてしまうので、ドキュメントをあさります。
最初は何ができるか。を理解していなかったので大変でしたが、最近は利用したい関数と組み立て方は理解してきたきがします。
特にデータの整合性確認はテーブルマージしたり、不正値確認したり、DataFrameの関数で色々できるのでおすすめです。

ライトコードでは、エンジニアを積極採用中!

ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

採用情報へ

けったん(エンジニア)
けったん(エンジニア)
Show more...

おすすめ記事

エンジニア大募集中!

ライトコードでは、エンジニアを積極採用中です。

特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

また、フリーランスエンジニア様も大募集中です。

background