2015-11-17 3 views
23

Wie multipliziere ich jedes Element einer bestimmten Spalte meines Datenrahmens mit einem Skalar? (Ich habe versucht, Blick auf SO, kann aber nicht die richtige Lösung scheint zu finden) wiePython: Pandas Dataframe Wie man ganze Spalte mit einem Skalar multipliziert

mache ich etwas:

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

gibt mir eine Warnung:

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 

Hinweis: Wenn möglich, Ich möchte nicht über den Datenrahmen iterieren und so etwas tun ... da ich denke, dass jede mathematische Operation in einer ganzen Spalte möglich ist, ohne dass eine Schleife geschrieben werden muss:

EDIT:

I 0.16.2 von Pandas leite

volle Spur:

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

Überprüfen Sie den Typ dieser Spalte mit 'dtype'. Ich kann diesen Fehler nicht replizieren, es ist auch gut, eine vollständige Rückverfolgung zu geben. – Leb

+0

Ich habe bearbeitet, um vollständige Spur hinzuzufügen ... auch ist es kein Fehler, es ist eine Warnung (für Klarheit) – labheshr

+0

Ich denke, es wird durch etwas anderes als diese Linie verursacht, oder vielleicht diese Linie verursacht die Warnung zu steigen, das war von früher generiert. Was Sie bekommen, hängt mit dem Schneiden des Datenrahmens zusammen. – Leb

Antwort

28

Hier ist die Antwort nach einem wenig Forschung:

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

Das wirft eine SettingWithCopyWarning in Pandas 0.18. 0. – kadrach

0

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

+0

das ist nicht anders als df ['quantity'] * = -1 (und ja ich bekomme die gleiche warnung) – labheshr

23

versuchen Sie, Anwendung Funktion anwenden.

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

das ist ziemlich anmutig im vergleich zu loopen, obwohl ich immer noch das SettingWithCopyWarning – labheshr

2

Ein bisschen alt, aber ich war immer noch das gleiche SettingWithCopyWarning bekommen. Hier war meine Lösung:

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

Hinweis: für die Verwendung von Pandas 0.20.3, und suchen nach einer Antwort, die alle diese Optionen werden alle Arbeiten

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 

, die in

führt
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