データフレームからの選択が元のデータフレームのコピー、または元のビューであると決定するときに使用する規則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が使用している、およびそれをどのように適用するかという単純なルールがありません。特定のクエリを満たすデータフレーム内の値(または値のサブセット)。
ルールは次のとおりです。
すべての操作でコピーが生成されます
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 は、より完全な説明を提供します。