パンダはビューとコピーを生成するためにどのようなルールを使用しますか?

2014年04月25日に質問されました。  ·  閲覧回数 36.5k回  ·  ソース

orome picture
2014年04月25日

データフレームからの選択が元のデータフレームのコピーであるか、元のデータのビューであるかを決定するときに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']

ではない。

パンダが使用している、私が見逃しているという単純なルールはありますか? これらの特定のケースで何が起こっているのか。 特に、特定のクエリを満たすデータフレーム内のすべての値(または値のサブセット)を変更するにはどうすればよいですか(上記の最後の例で実行しようとしているように)?


注:これはこの質問と同じではありません; そして私はドキュメンテーションを読みまし

回答

Jeff picture
2014年04月25日
143

ルールとその後のオーバーライドは次のとおりです。

  • すべての操作でコピーが生成されます

  • inplace=Trueが提供されている場合、その場で変更されます。 一部の操作のみがこれをサポートします

  • たとえば.loc/.iloc/.iat/.atを設定するインデクサーは、

  • 単一のdtypedオブジェクトを取得するインデクサーは、ほとんどの場合ビューです(メモリレイアウトによっては、そうでない場合もあります。そのため、これは信頼できません)。 これは主に効率のためです。 (上記の例は.queryです。これは、 numexprによって評価されたコピーを常に返します)

  • 複数のdtypedオブジェクトを取得するインデクサーは常にコピーです。

chained indexing

df[df.C <= df.B].loc[:,'B':'E']

動作が保証されているわけではありません(したがって、これを実行しないでください)。

代わりに:

df.loc[df.C <= df.B, 'B':'E']

これはより高速で常に機能するため

チェーンインデックスは2つの別々のPython操作であるため、パンダによって確実に傍受されることはありません(多くの場合、 SettingWithCopyWarning取得しますが、100%検出できるわけではありません)。 あなたが指摘した開発ドキュメントは、はるかに完全な説明を提供します。