web-dev-qa-db-fra.com

Python: Pandas Dataframe comment multiplier une colonne entière avec un scalaire

Comment puis-je multiplier chaque élément d'une colonne donnée de mon cadre de données avec un scalaire? (J'ai essayé de regarder SO, mais je n'arrive pas à trouver la bonne solution)

Faire quelque chose comme: 

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

me donne un avertissement: 

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

Remarque: Si possible, je ne souhaite pas effectuer une itération sur le cadre de données et faire quelque chose comme ceci ... car je pense que toute opération mathématique standard sur une colonne entière devrait être possible sans avoir à écrire une boucle:

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

MODIFIER

Je cours 0.16.2 de pandas

trace complète:

 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
35
labheshr

Voici la réponse après quelques recherches:

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

essayez d'utiliser la fonction apply. 

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

Remarque: pour ceux qui utilisent les pandas 0.20.3 et supérieurs et cherchent une réponse, toutes ces options fonctionneront:

df = pd.DataFrame(np.ones((5,6)),columns=['one','two','three',
                                       'four','five','six'])
df.one *=5
df.two = df.two*5
df.three = df.three.multiply(5)
df['four'] = df['four']*5
df.loc[:, 'five'] *=5
df.iloc[:, 5] = df.iloc[:, 5]*5

qui se traduit par

   one  two  three  four  five  six
0  5.0  5.0    5.0   5.0   5.0  5.0
1  5.0  5.0    5.0   5.0   5.0  5.0
2  5.0  5.0    5.0   5.0   5.0  5.0
3  5.0  5.0    5.0   5.0   5.0  5.0
4  5.0  5.0    5.0   5.0   5.0  5.0
27
DJK

Un peu vieux, mais je recevais toujours le même SettingWithCopyWarning. Voici ma solution:

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

Les versions plus récentes des pandas ont la fonction pd.DataFrame.multiply.

df['quantity'] = df['quantity'].multiply(-1)
0
stephenb

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

0
GiannisIordanou

J'ai eu cet avertissement en utilisant Pandas 0.22. Vous pouvez éviter cela en étant very explicit en utilisant la méthode assign :

df = df.assign(quantity = df.quantity.mul(-1))
0
Michael Rice