私はRからpandasに切り替えました。私は私が問題を理解すると思うインデックス作成操作でビューまたはコピーを返すかどうかが定義されていない場合、pandasのビューポイントとは何ですか?
df_a = pd.DataFrame({'col1': [1,2,3,4]})
# Filtering step, which may or may not return a view
df_b = df_a[df_a['col1'] > 1]
# Add a new column to df_b
df_b['new_col'] = 2 * df_b['col1']
# SettingWithCopyWarning!!
のような何かをするとき、私は喜んで私が間違って得たものを学びますけれども、私は日常的に、SettingWithCopyWarningsを取得します。与えられた例では、df_b
がdf_a
のビューであるかどうかは不定です。したがって、df_b
に割り当てる効果は不明です。それはdf_a
に影響しますか?私たちは本当に私たちはビューを作成するかどうか、のために良い景色は何であるかどうかを確認することはできません場合:
df_a = pd.DataFrame({'col1': [1,2,3,4]})
# Filtering step, definitely a copy now
df_b = df_a[df_a['col1'] > 1].copy()
# Add a new column to df_b
df_b['new_col'] = 2 * df_b['col1']
# No Warning now
私は、私が行方不明です何かがあると思います。問題は、フィルタリング時に明示的にコピーを作成することにより解決することができます?パンダのドキュメント(http://pandas-docs.github.io/pandas-docs-travis/indexing.html?highlight=view#indexing-view-versus-copy)
からの簡単な例外では、それはそれ[のGetItem]が表示またはコピーを返すかどうかを予測するのは非常に難しい(それがどの程度、配列のメモリレイアウトに依存しますパンダは保証しません)
さまざまなインデックス方法についても同様の警告があります。
コード全体で.copy()呼び出しを振りかけるのは非常に面倒でerrorproneです。自分のDataFrameを操作するために間違ったスタイルを使用していますか?それとも、パフォーマンスが非常に高いので、明らかに不自然さを正当化するのでしょうか?
この新しい警告は、次の割り当てによって安全に無効にすることができます。 'pd.options.mode.chained_assignment = None' –
Hmmm、おそらくインデックスをリセットするのに役立ちます' df_b = df_a [df_a ['col1']> 1] .reset_index(drop = True) '。 – jezrael
@GeorgePetrov私はそれを無効にすることを強くお勧めします!警告は正当な理由で出てきます。何かがあれば、警告の代わりに例外に宣伝することをお勧めします。 –