web-dev-qa-db-ja.com

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が使用していないという単純なルールがありますか?これらの特定のケースで何が起こっていますか?特に、すべての値(または値のサブセット)を変更するにはどうすればよいですか?特定のクエリを満たすデータフレームで(上記の最後の例でやろうとしているように)?


注:これは this question ;と同じではありません。そして、私は ドキュメント を読みましたが、それによって啓発されていません。このトピックの「関連」の質問も読んでいますが、まだPandasが使用している、およびそれをどのように適用するかという単純なルールがありません。特定のクエリを満たすデータフレーム内の値(または値のサブセット)。

90
orome

ルールは次のとおりです。

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

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

  • 設定するインデクサー。 .loc/.iloc/.iat/.atはインプレースに設定されます。

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

  • 複数の型が指定されたオブジェクトを取得するインデクサーは、常にコピーです。

chained indexingの例

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

動作することは保証されていません(したがって、neverこれを行う必要があります)。

代わりに:

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

これはより速いであり、常に動作する

連鎖インデックスは2つの独立したpython操作であるため、pandasによって確実にインターセプトできません(多くの場合、SettingWithCopyWarningを取得しますが、あなたが指摘した dev docs は、より完全な説明を提供します。

104
Jeff