2016-05-25 8 views
1

パンダのSettingWithCopyWarningを理解しようとしています。私はデータフレームから列を選択し、この列の選択で作業したいと思います。不足している値を入力し、1より大きい値をすべて1に置き換える必要があります。pandas SettingWithCopy警告サブセットの列を使用する場合の警告

sub_df = df [['col1'、 'col2'、 'col3']]はコピーを生成し、が欲しいです。問題があるかどうか、それを避ける方法を教えてください。

私はこの文脈で連鎖割当てについてたくさん読んでいますが、私はここでこれをやっていますか?

data={'col1' : [25 , 0, 100, None], 
    'col2' : [50 , 0 , 0, None], 
     'col3' : [None, None, None, 100], 
     'col4' : [ 20 , 20 , 20 , 20 ], 
     'col5' : [1,1,2,3]} 
df= pd.DataFrame(data) 
sub_df=df[['col1', 'col2', 'col3']] 
sub_df.fillna(0, inplace=True) 
sub_df[df>1]=1 # produces the copy warning 
sub_df 

本当に私は以下のように列の私のサブセットのための新しい名前を使用していない場合は、この警告がトリガされていない理由を私は混乱:

data={'col1' : [25 , 0, 100, None], 
    'col2' : [50 , 0 , 0, None], 
     'col3' : [None, None, None, 100], 
     'col4' : [ 20 , 20 , 20 , 20 ], 
     'col5' : [1,1,2,3]} 
df= pd.DataFrame(data) 
df=df[['col1', 'col2', 'col3']] 
df.fillna(0, inplace=True) 
df[df>1]=1 # does not produce the copy warning 
df 

感謝を!最初にそれはそうが不明確ではない場合、あなたがdfのサブセットでdfを上書きする第二に、あなたはビューまたは元DFのコピー上で動作するかどうか曖昧だ

+0

2つのコードスニペットは番目に、意味的に異なっています元のdfのサブセットを元のdfに上書きすることで、元のdfのコピーまたはビュー上で操作したいかどうかは最初は曖昧です。 – EdChum

+0

ありがとうございます。私はコピーを作成したいですか?どのくらい私はそれをやるのだろうか? – Eva

+0

それは、あなたの意図がコピーに作用することになっている場合、 'sub_df = df [['col1'、 'col2'、 'col3']] copy()'を実行することです。ビュー上で操作する場合は、colのリストを定義し、新しい['indexers'](http://pandas.pydata.org/pandas-docs/stable/indexing.html#different-choices- df.loc [df1、col_list] = 1' – EdChum

答えて

1

あなたの2つのコードスニペットは、意味的に異なっています。

あなたはコピーを操作したい場合は、この操作を行います。

sub_df=df[['col1', 'col2', 'col3']].copy() 

をビュー上で操作したい場合は、その後、私はCOLSのリストを使用して、次のような新しいindexersを使用してそれらを参照することをお勧め:

df[col_list].fillna(0) 

、次いで

df.loc[df > 1, col_list] = 1 
+0

最初の行は2つのコピーをしませんか? – Konstantin

+0

@コンスタンチンごめんなさい申し訳ありませんが、最初の行はorig dfのサブセクションである2番目のdfを作成しますが、ビューではなく別のコピーになります – EdChum

+0

df [['col1' 、 'col2'、 'col3']]はまだコピーを作成していないので、.copy()を追加すると2番目のコピーが作成されます。 – Konstantin