問題タブ [chained-assignment]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 混乱再:データフレーム警告のスライスのパンダコピー
この問題に関連する多くの質問と回答を調べましたが、予期しない場所でこのスライス警告のコピーが表示されていることがわかりました。また、以前は正常に実行されていたコードで発生しているため、何らかの更新が原因である可能性があるのではないかと考えています.
たとえば、これは、Excel ファイルを pandas に読み込み、構文 DataFrame
に含まれる列のセットを削減するだけの一連のコードです。df[[]]
ここで、このファイルにさらに変更を加えるとizmir_lim
、スライス警告のコピーが発生します。
/Users/samliienfeld/anaconda/lib/python3.5/site-packages/ipykernel/ main .py:2: SettingWithCopyWarning: DataFrame からスライスのコピーに値を設定しようとしています。代わりに .loc[row_indexer,col_indexer] = value を使用してみてください
df[[]]
列のサブセット化がデフォルトでコピーを返すと思っていたので、私は混乱しています。エラーを抑制するために私が見つけた唯一の方法は、明示的に追加することdf[[]].copy()
です。以前はそうする必要はなく、スライス エラーのコピーを発生させなかったと断言することもできました。
同様に、データフレームで関数を実行して特定の方法でフィルタリングする他のコードがあります。
この時点から、 の値のいずれかに変更を加えるとdf_lim
、スライス エラーのコピーが発生します。私が見つけた唯一の方法は、関数呼び出しを次のように変更することです。
これは私には間違っているようです。私は何が欠けていますか?これらのユース ケースでは、デフォルトでコピーが返されるように思われます。これらのスクリプトを最後に実行したときには、これらのエラーは発生していなかったと断言できます。
あちこちに追加を開始する必要があり.copy()
ますか? これを行うためのよりクリーンな方法があるはずです。洞察や助けをいただければ幸いです。
python - SettingWithCopyWarning がない場合の予測不可能な pandas スライス割り当て動作
スライスに割り当てるときの pandas の動作は本質的に予測不可能であることはよく知られています(そして理解できます)。しかし、私は警告によってそれについて警告されることに慣れていSettingWithCopy
ます。
次の 2 つのコード スニペットのいずれでも警告が生成されないのはなぜですか?また、そのようなコードを意図せずに作成する可能性を減らすには、どのような手法を使用すればよいでしょうか?
説明は、現在のコンテキストから親 DataFrame にまだ到達できる場合にのみ、パンダが警告を生成するというものだと思いました。(前の例が示すように、これは検出アルゴリズムの弱点です。)
次のスニペットでは、元の 2 列の DataFrame に到達できなくなっていることがわかりますが、pandas の警告メカニズムは (幸いなことに) トリガーされます。
編集:
これを調査しているときに、警告が欠落している別のケースを見つけました。
ほぼ同じ例でも警告がトリガーされます。
更新: コメントに入れるのが難しいため、ここで @firelynx の回答に返信します。
回答で、@firelynx は、データフレーム全体を取得しているため、最初のコード スニペットでは警告が発生しないと述べています。しかし、参加したとしても、警告は表示されません。
python - データフレーム ビューまたはコピーの利点は何ですか
SettingWithCopy
悪名高い警告について多くの質問を見てきました。私はそれらのいくつかにあえて答えることさえしました。最近、このトピックに関する回答をまとめていて、データフレーム ビューの利点を提示したいと考えていました。なぜデータフレームビューを作成するのが良い考えなのか、またはそれが生成するものは何であれ、具体的なデモンストレーションを作成できませんでしたSettingWithCopy
検討df
そして、dfv
これはのコピーですdf
私は生成することができますSettingWithCopy
ただし、dfv
変わった
df
していない
そしてdfv
まだコピーです
私が変わればdf
しかしdfv
、変わっていません。しかし、私はdf
から参照することができますdfv
質問
がdfv
独自のデータを保持し (つまり、実際にはメモリを節約しない)、警告にもかかわらず代入操作を介して値を代入する場合、なぜ最初から参照を保存して生成SettingWithCopyWarning
する必要があるのでしょうか?
具体的なメリットは何ですか?
python - なぜやみくもに df.copy() を使用して SettingWithCopyWarning を修正するのが悪い考えなのか
恐ろしいものについての無数の質問がありますSettingWithCopyWarning
それがどのように起こるかについて、私はよく理解しています。(私が良いと言ったことに注意してください、素晴らしいではありません)
df
に格納されている属性を介して、データフレームが別のデータフレームに「アタッチ」されている場合に発生しis_copy
ます。
これが例です
その属性をNone
またはに設定できます
@Jeff のような開発者を見たことがありますが、他に誰がいるか思い出せません。SettingWithCopyWarning
目的があることを引用します。
質問では、オリジナルにバックを
割り当てることによって警告を無視することがなぜ悪い考えであるかを示す具体的な例は何ですか?copy
明確にするために、 「悪い考え」を定義します。
悪い考えコードが壊れているので修正が必要だという電話が土曜の夜中にかかるようなコードを本番環境に置く
のは悪い考えです。
df = df.copy()
リードを迂回SettingWithCopyWarning
してその種の電話を受けるにはどうすればよいでしょうか。これは混乱の原因であり、明確にしようとしているため、詳しく説明したいと思います。爆破するエッジケースが見たい!