python pandas データフレームに空のシリースを追加すると、またしても警告が…

またしても SettingWithCopyWarning の警告が出た。

既にあるデータフレーム(シリーズ)に、空の新しいシリーズを作ってすぐ追加したい場合に。

こんな警告が出てくる。

便利APIやアクセサ経由でデータフレームを操作した時に出た警告と同じだけど、

今度は、自分のコード自体がエラーの発生箇所になってるけど、
指定されたURLを覗いてみると、原因は以前の時と同じみたいだ。

pythonの中で二度呼びされるから、予期しない結果になるかも知れないよ、とのこと。

Since the chained indexing is 2 calls, it is possible that either call may return a copy of the data because of the way it is sliced. Thus when setting, you are actually setting a copy, and not the original frame data. It is impossible for pandas to figure this out because their are 2 separate python operations that are not connected.

The SettingWithCopy warning is a ‘heuristic’ to detect this (meaning it tends to catch most cases but is simply a lightweight check). Figuring this out for real is way complicated.

The .loc operation is a single python operation, and thus can select a slice (which still may be a copy), but allows pandas to assign that slice back into the frame after it is modified, thus setting the values as you would think.

The reason for having the SettingWithCopy warning is this. Sometimes when you slice an array you will simply get a view back, which means you can set it no problem. However, even a single dtyped array can generate a copy if it is sliced in a particular way. A multi-dtyped DataFrame (meaning it has say float and object data), will almost always yield a copy. Whether a view is created is dependent on the memory layout of the array.

0のリストを二つ作ったつもりが、一つしか作られてないって事なんでしょね。

ちなみに初期値をあたえないで、こう書くと、警告は出ない。

けど、NaNで都合が悪い場合は、改めて初期値を入れてやんなきゃならない。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です