Pandas の `s.replace` が辞書ベースの値置換で遅いのはなぜですか?

DDD
リリース: 2024-11-19 21:45:03
オリジナル
516 人が閲覧しました

Why is Pandas' `s.replace` Slow for Dictionary-Based Value Replacement?

Pandas の s.replace と他の値置換メソッド間のパフォーマンス ギャップを理解する

辞書を使用して Pandas シリーズの値を置換することは、共通のタスク。ただし、この操作に推奨されるメソッドである s.replace は、リスト内包表記などの代替メソッドと比較してパフォーマンスが大幅に低下することがよくあります。

s.replace の遅さの根本原因

s.replace は、単純な辞書マッピングを超える追加の処理を実行します。より複雑で時間のかかる操作が必要となる、特殊なケースやまれな状況に対応します。具体的には、s.replace は辞書をリストに変換し、ネストされた辞書をチェックし、リストを反復処理してキーと値を別の置換関数に入力します。このオーバーヘッドにより、プロセスが大幅に遅くなります。

値の置換の最適化

値の置換を最適化するには、次のガイドラインに従う必要があります:

  • すべての系列値が辞書キーでカバーされる場合は、s.map(d) を使用します。 s.map は、このシナリオで優れたパフォーマンスを示します。
  • 5% を超える場合は、s.map(d).fillna(s['A']).astype(int) を使用してください。シリーズ値は辞書キーでカバーされます。このメソッドは、s.map の効率と欠損値を処理する機能を組み合わせています。
  • 少数の値 (5% 未満) を必要とする場合は、s.replace(d) を使用します。取り替えられる。この状況では、s.replace の方が比較的高速です。

ベンチマーク

ベンチマークの結果は、さまざまな置換方法間のパフォーマンスの違いを示しています。

テスト 1 - フルMap

%timeit df['A'].replace(d)  # 1.98s
%timeit df['A'].map(d)      # 84.3ms
%timeit [d[i] for i in lst]  # 134ms
ログイン後にコピー

テスト 2 - 部分的なマップ

%timeit df['A'].replace(d)                  # 20.1ms
%timeit df['A'].map(d).fillna(df['A']).astype(int)  # 111ms
%timeit [d.get(i, i) for i in lst]                  # 243ms
ログイン後にコピー

これらの結果は、s.map とその修正バージョンが s よりも大幅に高速に実行されることを明らかに示しています。 .replace、特に系列値のかなりの部分が辞書キーでカバーされている場合。

以上がPandas の `s.replace` が辞書ベースの値置換で遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート