2014-05-15 25 views
7
Ben onları beklemek olmaz durumlarda SettingWithCopyWarning hataları olsun

(?):SettingWithCopyWarning, loc kullanırken bile

N.In <38>: # Column B does not exist yet 
N.In <39>: df['B'] = df['A']/25 
N.In <40>: df['B'] = df['A']/50 

/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/core/indexing.py:389: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_index,col_indexer] = value instead 
    self.obj[item] = s 

ve

N.In <41>: df.loc[:,'B'] = df['A']/50 

/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/core/indexing.py:389: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_index,col_indexer] = value instead 
    self.obj[item] = s 

Neden durumda 1. ve 2. oluyor?

+0

Kodunu göstermeniz gerekiyor e bu kadar önce (u kadar yapabilirsiniz) – Jeff

+0

Teşekkürler @Jeff Birkaç önceki satırlarda OP'yi güncelledim –

+0

Bundan önce ekleyin; Daha önce – Jeff

cevap

7

1, df['A'] durumunda, df bir kopyasını oluşturur. Pandas documentation tarafından açıklandığı gibi, bu zincirleme sırasında beklenmedik sonuçlara yol açabilir, böylece bir uyarı verilir. Durum 2 doğru görünüyor, ama yanlış pozitif mümkündür:

Uyarı: zincirleme atama uyarıları/istisnalar bir olasılıkla geçersiz atama kullanıcıyı bilgilendirmek hedefliyoruz. Yanlış pozitif olabilir; Zincirli bir atamanın istemeden bildirildiği durumlar.

,

df.is_copy = False 

tamamen zincirleme atama uyarıları kapatmak için kullanabilir, tek dataframe için SettingWithCopyWarning kapatmak

options.mode.chained_assignment = None 
+0

konumunda bir işlem gerçekleştiriliyor Uyarıyı devre dışı bırakmak için aşağıdakileri kullanın: 'pd.set_option ('chained_assignment', Yok)' – danger89

3

uyarı bastırmak gerekir Başka bir çözüm kullanmak için:

df = df.copy() 
df['B'] = df['A']/25 
df['B'] = df['A']/50 
+1

Bu gerçekten işe yarar. Bunun artık daha hızlı mı yoksa daha fazla bellek tüketen mi olduğunu tam olarak anlayamıyorum. Copy() komutunun etkisini bilmiyorum. Aslında, kopya tekrar df'ye yeniden atanıyor. Sonunda hiçbir şeyin değişmediğine benziyor. – danger89

İlgili konular