2015-11-17 91 views
23

Come faccio a moltiplicare ogni elemento di una data colonna del mio dataframe con uno scalare? (ho provato a guardare SO, ma non riesco a trovare la giusta soluzione)Python: Pandas Dataframe come moltiplicare l'intera colonna con uno scalare

fare qualcosa di simile:

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

mi dà un avvertimento:

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 

Nota: Se possibile, Non voglio ripetere il dataframe e fare qualcosa di simile ... poiché penso che qualsiasi operazione matematica standard su un'intera colonna dovrebbe essere possibile senza dover scrivere un ciclo:

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

EDIT:

Sono in esecuzione 0.16.2 di panda

piena traccia:

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

Controlla il tipo di quella colonna usando 'dtype'. Non riesco a replicare questo errore, è anche bene dare il traceback completo. – Leb

+0

Ho modificato per aggiungere traccia completa ... inoltre non è un errore, è un avvertimento (per chiarezza) – labheshr

+0

Penso che sia causato da qualcosa di diverso da quella linea, o forse quella linea sta causando l'avviso che è generato da prima. Quello che stai ottenendo è legato all'affinamento del dataframe. – Leb

risposta

28

Ecco la risposta, dopo un po 'di ricerca:

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

Questo getta un SettingWithCopyWarning in panda 0.18. 0. – kadrach

0

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

+0

non è diverso da df ['quantity'] * = -1 (e sì ottengo lo stesso avviso) – labheshr

23

provare a utilizzare la funzione apply.

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

questo è piuttosto aggraziato rispetto al loop, anche se ottengo ancora il SettingWithCopyWarning – labheshr

2

Un po' vecchio, ma ero ancora ottenere lo stesso SettingWithCopyWarning. Qui era la mia soluzione:

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

Nota: per coloro che utilizzano i panda 0.20.3, e sono alla ricerca di una risposta, tutte queste opzioni saranno tutti i lavori

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 

che si traduce in

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 
Problemi correlati