お疲れ様です。シニアエンジニアの〇〇です。最近Pandasをバージョンアップしたら、これまで何の問題もなく動いていたコードが突然クラッシュする事態に遭遇しました。特にデータフレームの結合処理でハマってしまったので、その時の状況と解決策をメモとして残します。
何が起きたか(課題)
Pandas 2.0系にアップデートした後、既存のデータ処理スクリプトを実行したところ、次のエラーで処理が停止しました。
AttributeError: 'DataFrame' object has no attribute 'append'
これは、長年使われてきたDataFrameのappendメソッドが、Pandasの新しいバージョンで完全に削除されたことが原因でした。このままでは業務で使うデータパイプラインが動かせないので、早急な対応が必要でした。
どう解決したか(概要)
結論として、古いdf.append()の呼び出しを、より柔軟で標準的なpd.concat()関数に置き換えることで解決しました。この変更はPandas 1.4.0以降で非推奨化され、2.0.0で削除されています。pd.concat()を使うことで、複数DataFrameの縦方向結合が安全に行えます。また、結合方向(axis)やインデックスのリセット(ignore_index=True)といった制御も可能になりました。
さらに、パフォーマンスの観点から、ループ内で毎回pd.concat()を実行するアンチパターンを避けました。代わりに、処理したいデータをリストにディクショナリ形式で蓄積し、ループ終了後にpd.DataFrame(list_of_dicts)として一括でDataFrameを生成するアプローチを採用しました。
Pandas 2.0移行後の、DataFrame結合のベストプラクティスはこの形になります。
効果(Before/After)
逐次結合(アンチパターン)と一括結合(推奨)では、データ件数が増えるほど劇的な速度差が出ます。例えば1000件のデータを処理する場合、逐次結合では数秒かかっていた処理が、一括結合に切り替えることでほぼ瞬時に完了するようになりました。この最適化は大規模データ処理では必須の対応です。
🚀 詳細な設定とコードはこちら
具体的なWAFのルール設定や、より詳細なログ解析データは元のブログで公開しています。