2015-11-17 18 views
23

Veritabanımın belirli bir sütununun her öğesini skaler ile nasıl çoğaltabilirim? Eğer, olası: (SO üzerinde seyir çalıştı, ancak doğru çözüm bulmak gibi olamaz) gibi bir şey yapmakPython: Pandalar Dataframe skaler ile tüm sütunun nasıl çoğaltılacağı

:

A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

Not:

df['quantity'] *= -1 # trying to multiply each row's quantity column with -1 

bana bir uyarı verir Ben dataframe üzerinde yineleme ve bu gibi bir şey yapmak istemiyorum ... bir sütun yazmak için herhangi bir standart matematik işlemi mümkün olmalıdır w/o bir döngü yazmak zorunda olabileceğini düşünüyorum:

for idx, row in df.iterrows(): 
    df.loc[idx, 'quantity'] *= -1 

DÜZENLEME: Ben

Pandalar

ait 0.16.2 çalıştırıyorum

tam iz:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    self.obj[item] = s 
+0

'dtype' işlevini kullanarak bu sütunun türünü kontrol edin. Bu hatayı tekrarlayamıyorum, ayrıca tam iz bırakma da iyidir. – Leb

+0

Tam izlemeye eklemek için düzenledim ... ayrıca onun bir hata değil, bir uyarı (açıklık için) – labheshr

+0

Bence bu satırdan başka bir şey tarafından kaynaklanıyor olabilir, ya da belki de bu satırın uyarıya neden olduğu daha önce üretildi. Elde ettiğin şey veri çerçevesini kesmekle ilgili. – Leb

cevap

28

İşte biraz araştırma sonrasında cevabı:

df.loc[:,'quantity'] *= -1 #seems to prevent SettingWithCopyWarning 
+0

almak olsa da, döngü ile karşılaştırıldığında oldukça zarif Bu pandalar 0.18 bir SettingWithCopyWarning atar. 0. – kadrach

0

df['quantity'] = df['quantity'] * -1 deneyin.

+0

bu, df ['miktar'] * = -1 (ve aynı uyarıyı aldığımda) farklı değil – labheshr

23

Uygulama işlevini kullanmayı deneyin.

df['quantity'] = df['quantity'].apply(lambda x: x*-1) 
+0

Bu, yine de SettingWithCopyWarning – labheshr

2

Biraz eski, ama hala aynı SettingWithCopyWarning başlamıştı.

df.loc[:, 'quantity'] = df['quantity'] * -1 
9

Not: İşte benim çözüm oldu panda 0.20.3 kullanılarak ve bu tüm bu seçenekler

one two three four 
0 5.0 5.0 5.0 5.0 
1 5.0 5.0 5.0 5.0 
2 5.0 5.0 5.0 5.0 
3 5.0 5.0 5.0 5.0 
4 5.0 5.0 5.0 5.0 
sonuçlanır tüm esere

df = pd.DataFrame(np.ones((5,4)),columns=['one','two','three','four']) 

df.one*=5 
df.two = df.two*5 
df.three = df.three.multiply(5) 
df['four'] = df['four']*5 

, bir cevap olacaktır arıyoruz