[解決済み] Pandasはどのようなルールでビューとコピーを生成するのでしょうか?
質問
データフレームからの選択が元のデータフレームのコピーであるか、元のデータフレームに対するビューであるかを決定する際に、Pandasが使用するルールについて混乱しています。
もし、例えば
df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))
というのはわかりますが
query
はコピーを返すので、次のようなものは
foo = df.query('2 < index <= 5')
foo.loc[:,'E'] = 40
は、元のデータフレームに影響を与えません。
df
. また、スカラーまたは名前付きスライスがビューを返すことも理解しているので、これらに対する代入、たとえば
df.iloc[3] = 70
または
df.ix[1,'B':'E'] = 222
を変更します。
df
. でも、もっと複雑なケースになると迷いますね。例えば
df[df.C <= df.B] = 7654321
変化
df
しかし
df[df.C <= df.B].ix[:,'B':'E']
はしません。
Pandasが使っている簡単なルールで、私が見逃しているだけなのでしょうか?特に、(上記の最後の例で試みているように)特定のクエリを満たすデータフレーム内のすべての値(または値のサブセット)を変更するにはどうしたらよいでしょうか?
注:これは この質問 を読みました。 ドキュメント ということなのでしょうが、どうも釈然としません。このトピックに関する "Related" の質問にも目を通しましたが、Pandas が使用している単純なルールと、それを適用して - たとえば、特定のクエリを満たすデータフレーム内の値(または値のサブセット)を変更するにはどうすればよいかがまだわかっていません。
解決するには?
ここにルールがあり、その後にオーバーライドします。
-
すべての操作でコピーを生成
-
もし
inplace=True
を指定すると、インプレースで変更されます。 -
を設定するインデクサ。
.loc/.iloc/.iat/.at
はインプレースで設定します。 -
単一型オブジェクトを取得するインデクサは、ほとんどの場合ビューです (メモリレイアウトによっては、これが信頼できない理由です)。これは主に効率化のためです。(上記の例は
.query
これは 常に で評価されたコピーを返します。numexpr
) -
多重型付けされたオブジェクトを取得するインデクサは、常にコピーである。
の例では
chained indexing
df[df.C <= df.B].loc[:,'B':'E']
は動作保証外です。 決して を実行します)。
その代わり、こうしてください。
df.loc[df.C <= df.B, 'B':'E']
このように より速く で、常に動作します。
連鎖したインデックスは2つの別々のPython操作であるため、pandasが確実に傍受することはできません(頻繁に
SettingWithCopyWarning
が、これも100%検出できるわけではありません)。その
デブ・ドックス
ご指摘の通り、もっと詳しい説明があります。
関連
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] Pythonの "assert "はどのように使うのですか?
-
[解決済み] Pandasのデータフレームから行を選択するために値のリストを使用する
-
[解決済み] 重複するインデックスを持つpandasの行を削除する
-
[解決済み] pandasのaxisとはどういう意味ですか?
-
[解決済み】if __name__ == "__main__": は何をするのでしょうか?
-
[解決済み】なぜpandasでデータフレームのコピーを作成する必要があるのか
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ピローによる動的キャプチャ認識のためのPythonサンプルコード
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】socket.error: [Errno 48] アドレスはすでに使用中です。
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み] Python Pandasは特定の列のみをマージする
-
[解決済み】Pandas DataframeのカラムでNaN値をゼロに置き換えるには?