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


118

データフレームからの選択が元のデータフレームのコピーまたは元のビューであると決定するときにPandasが使用するルールについて混乱しています。

たとえば、

df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))

queryはaがコピーを返すので、

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が使用している単純なルールや、それをどのように適用するか(たとえば、値(または値のサブセット)の変更)がまだありません。特定のクエリを満たすデータフレーム内。

回答:


138

ルールとそれに続くオーバーライドは次のとおりです。

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

  • 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操作であるため、パンダによって確実にインターセプトすることはできません(多くの場合SettingWithCopyWarning、が表示されますが、100%検出可能でもありません)。DEVドキュメントあなたが指摘し、はるかに十分な説明を提供します。


3
.queryn numexprによって評価されるので、(ビューではなく)その処理のために常にコピーを返します。それを「ルール」に追加します
Jeff

3
パンダは、ビューが生成されるかどうかを決定するためにnumpyに依存しています。単一のdtypeケース(シリーズの場合は1-d、フレームの場合は2-dなど)。numpy ビューを生成する場合があります。スライスする対象によって異なります。ビューを取得できる場合とできない場合があります。パンダは、ビューが生成されるかどうかが常に明らかであるとは限らないため、この事実にまったく依存していません。locは設定時にこれに依存しないため、これは問題ではありません。ただし、チェーンインデックスを作成する場合、これは非常に重要です(したがって、チェーンインデックスが不適切である理由)
Jeff

3
ジェフに感謝します。あなたの返信が最も役に立ちます。このトピックの出典/参照は何ですか?
Kamixave 14

4
それでは、最初にあなたの素晴らしい仕事に感謝します!次に、十分な時間があれば、ドキュメント内のメインの返信に似た段落を追加するとよいと思います。
Kamixave 2014

2
確かに、ドキュメントを追加/修正するためのプルリクエストが必要です。頑張れ。
ジェフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.