はじめに
アオのハコのリアタイは、劇薬。nikkieです。
Today I learnedです
目次
- はじめに
- 目次
- DataFrameをcopyしてから加工する関数、一番単純な入力は空のDataFrameでは?
- 空のDataFrameってどう作る?
- おまけ:空のDataFrameを入力する場合のテスト
- 終わりに
DataFrameをcopyしてから加工する関数、一番単純な入力は空のDataFrameでは?
先日のPyCon mini 東海ではpytestでテスト駆動開発のワークショップで登壇しました。
今回の関数を見た時に、その経験からふと思ったのです。
この記事で取り上げる関数は、pandasのDataFrameを受け取り、それをcopyしてから加工して、新たなDataFrameを返しています。
つまり、渡したDataFrameにいくつかカラムが追加されたものが返ります(copyしているので元のDataFrameには副作用なし)。
ということは、空のDataFrameを渡したら、カラムが追加された空のDataFrameが返ってくるはずですよね。
テスト駆動開発っぽくやるなら、まず空のケースのテストなんじゃないかと思ったのです。
空のDataFrameってどう作る?
空のケースのテストを書くにあたって苦労したのが、空のDataFrameの作り方。
現時点の結論は以下です。
empty_df = pd.DataFrame(
{
"column1": pd.Series(dtype="int64"),
"column2": pd.Series(dtype="float64"),
"column3": pd.Series(dtype="object"),
}
)
pandasのドキュメントを中心に引いて考えていき、一度動かした後はChatGPTにやりたいことを伝えて書かせました。
苦闘したのよりはるかによい実装だったので、ChatGPT案を採用しています。
DataFrameのドキュメントにドンピシャなものは見つけられていませんが、@dataclassのインスタンスからDataFrameを作れるといったことも知りました。
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html
おまけ:空のDataFrameを入力する場合のテスト
% uvx --python 3.12 --with pandas pytest -v script.py
- Python 3.12.5
- pytest 8.3.3
- pandas 2.2.3
Seriesが寄せ集まってDataFrameということなのかもしれないですね。
空のSeriesが集まったので、DataFrameとしても空。
終わりに
pandasで空のDataFrame、キーにカラム名、値にdtypeのみ指定(文字列で指定)したSeriesからなる辞書を渡して作れました!
DataFrameを加工する関数に自動テストを書く試みは、なかなかよいスタートを切ったんじゃないかと思います!