クロスオーダー請求書で実際に使っているpandasのご紹介


2023年8月よりクロスマートのバックエンドエンジニアとして入社しました中松です。
フルリモートで大阪から参画させていただいてます。
オフィスに一度も行かないまま入社したのが衝撃的でした!
違う業界からのジョブチェンジになるので、Python以外の実務経験はほぼなく、
しかも息子がまだ0歳という状態からクロスマートで働かせていただいており、
チャンスやご縁をくださった方々には感謝です。
小さなお子さんがいらっしゃる方も多く、非常に家族を大切にしていらっしゃる方が多いのがとても印象的です。

今更だけどpandasすごい

Python歴はそこそこあるもののpandasを知りませんでした(恥)
csv(表データ)をゴニョゴニョする上でこんなに便利なライブラリがあったとは!

まず、pandasで扱うDataFrame型にcsvのデータを読み込みます。

import pandas as pd

df = pd.read_csv("sample.csv")

これだけ!短い!

請求書の機能を作成する際に実際に使った便利pandasを紹介!

クロスオーダー請求書では外部のシステムから出力されたcsvデータを読み込んで請求書を作成しています。

請求書番号 合計金額 取引先コード 商品名 個数 明細金額
1000001 4000 A111 豚肉 1 1000
1000001 4000 A111 鶏肉 2 1600
1000001 4000 A111 牛肉 1 1400

このようなデータを使っています。(実際のデータはもっと項目数が多いです)
これで1枚の請求書が出来上がります。

① 請求書のデータが2つに分かれている

合算.csv

請求書番号 合計金額 取引先コード
1000001 4000 A111

明細.csv

取引先コード 商品名 個数 明細金額
A111 豚肉 1 1000
A111 鶏肉 2 1600
A111 牛肉 1 1400

これでは既存のシステムに取り込めないため、マージすることにしました。

df_total = pd.read_csv("合算.csv")
df_detail = pd.read_csv("明細.csv")
df = pd.merge(df_detail, df_total, left_on="取引先コード", right_on="取引先コード", suffixes=(None, "_y"), how="left", indicator=True)

これだけ!
マージするキーを指定してますが、同じ場合省略しても良いです。

請求書番号 合計金額 取引先コード 商品名 個数 明細金額 _merge
1000001 4000 A111 豚肉 1 1000 both
1000001 4000 A111 鶏肉 2 1600 both
1000001 4000 A111 牛肉 1 1400 both

indicatorをTrueにしておくだけで、どちらのデータに存在しているかの情報を付与してくれます。
こちらも大変便利です!

② 請求書のデータを置換したい

請求書のデータの一部を置換したい要望があがりました。
今回使用しているデータで取引先コードを1234に変更したいとします。

df["取引先コード"].replace({"A111": "1234"}, inplace=True)

これだけで該当するデータを置換してくれます!

どちらもすごく短いコードで簡単にかけるので驚きでした。。
pandasのよりパフォーマンスが上がったバージョンとして、
polarsというモジュールもあります。
よりたくさんのデータを処理する場合、polarsを使用していきたいですね。

最後に

クロスマートは事業拡大中のため、絶賛エンジニアを募集しています。
ご興味がある方は、是非こちらを御覧ください!

xorder.notion.site