
Pandas Tips

IT技術

はじめに
春になりました。花粉症の季節ですね。
杉林が目の前にあるので、見てるだけでつらたんです。
今日は業務で使ったPandasの便利なTipsを2つ紹介します。
Tips_1
やりたいこと
RDBのIDをULIDで置き換えたい。(外部キーで保持しているもの含め)
考えたこと
- 外部キーで利用しているIDをすべて置き換えなければならない
- SQLではめんどくさそう。できるのか?
- dictでIDとULIDを作成してしまえば問題ない
試行錯誤の結果
- 一旦既存のプライマリーキーを保持しているテーブルのすべてのIDをULIDとのペアをcsvとして書き出し
- 書き出したcsvをDataFrameとして読み込んでdictとして保持
- 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を算出して、それを顧客テーブルの属性に追加
- できそうだが簡単にやりたい
試行錯誤の結果
- 普通にPandasのgroupby, transformを利用
実際には、データの前処理やった後に、離れた階層のカウントが必要だったので、何度か繰り返して算出しました。
便利な関数が揃っているPandasですね。それと実行速度がSQLより早くていつもびっくりします(繰り返し処理でなくベクトル演算だから?)。実務では3,000万件スケールのデータで処理しました。
該当コード
1import pandas as pd
2source['count'] = source.groupby('target_id')['target_id'].transform('count')
まとめ
最近はDBのデータの整合性確認や、初期データの作成などにPandasをよく利用します。
毎回関数の利用方法は忘れてしまうので、ドキュメントをあさります。
最初は何ができるか。を理解していなかったので大変でしたが、最近は利用したい関数と組み立て方は理解してきたきがします。
特にデータの整合性確認はテーブルマージしたり、不正値確認したり、DataFrameの関数で色々できるのでおすすめです。
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ

ライトコードに転職してまだ日は浅いですが、毎日新鮮でワクワクしてます!