2016-08-07 3 views
6

を使用した後SettingWithCopyWarningを取得:しかしパンダはまだ私はこのように見えたいくつかのコード書いてみました、でも最初の.loc

complete.loc[:, 'AgeGt15'] = complete['Age'] > 15 
complete.loc[:, 'WithFamily'] = complete['SibSp'] + complete['Parch'] > 0 

:SettingWithCopyWarningを取得した後

import numpy as np 
import pandas as pd 
np.random.seed(2016) 
train = pd.DataFrame(np.random.choice([np.nan, 1, 2], size=(10, 3)), 
        columns=['Age', 'SibSp', 'Parch']) 

complete = train.dropna()  
complete['AgeGt15'] = complete['Age'] > 15 

を、私はusing.locを試してみました、私はまだ同じ警告を得る。何がありますか?

+5

これは私がこのトピックで読んだ最高の記事です:https://www.dataquest.io/blog/settingwithcopywarning/ また、こちらのパンダのドキュメントでも扱っています:http://pandas.pydata .org/pandas-docs/stable/indexing.html?highlight = chain#indexing-view-versus-copy – Alexander

答えて

12

complete = train.dropna()が実行されると、dropnaはコピーを返すことがありますので、 注意の豊富のうち、パンダはTruthy 値にcomplete.is_copyを設定します:ときcomplete['AgeGt15'] = complete['Age'] > 15

In [220]: complete.is_copy 
Out[220]: <weakref at 0x7f7f0b295b38; to 'DataFrame' at 0x7f7eee6fe668> 

これは、パンダが後を警告することができますtrainに影響しないコピーを変更している可能性があります。初心者にとっては、これは有用な警告になるかもしれません。あなたの場合は、completeを変更して間接的にtrainを変更するつもりはないようです。したがって、警告はあなたの場合に意味のない迷惑です。

あなたはこれが実際のコピーを作成するよりも高速で、かつ(ポイントwhere _check_setitem_copy is calledで)芽SettingWithCopyWarningをニップ

complete.is_copy = False 

を設定することで警告を消すことができます。

def _check_setitem_copy(self, stacklevel=4, t='setting', force=False): 
    if force or self.is_copy: 
     ... 

実際に自分が何をしているのかが分かっている場合は、

SettingWithCopyWarningをグローバルに遮断することができます
+1

これは一貫していると思いますか? 'drop_duplicates'では同じ警告が表示されますが、' drop'では表示されません。 – ayhan

+2

@ayhan: 'complete = complete.assign(AgeGt15 =(complete ['Age']> 15))'が使用されている場合、警告も表示されません。パンダが 'SettingWithCopyWarning'を推論するために使用する仕組みは馬鹿ではありません。最も一般的なケースを捕捉しますが、すべてではありません。 – unutbu

+0

'is_copy'トリックに感謝します - 私はそれが存在するのを知らなかった – MaxU

関連する問題