2016-06-15 3 views
11

Ich habe einen Pandas Datenrahmen: Daten. es hat Spalten [ "name", 'A', 'B']Korrekter Weg, um Wert auf ein Stück in Pandas

Was ich (und Arbeit) ist zu tun:

d2 = data[data['name'] == 'fred'] #This gives me multiple rows 
d2['A'] = 0 

Dies setzt die Spalte A auf den fred Zeilen 0 .

indexes = d2.index 
data['A'][indexes] = 0 

beide die gleiche Warnung geben Sie mir jedoch:

/Users/brianp/work/cyan/venv/lib/python2.7/site-packages/pandas/core/indexing.py:128: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame 

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 

Wie Pandas WILL mich thi tun ich habe auch getan s?

Antwort

30

Dies ist eine sehr häufige Warnung von Pandas. Das bedeutet, dass Sie in einem Kopierabschnitt schreiben, nicht die Originaldaten, sodass es aufgrund einer verwirrten verketteten Zuweisung möglicherweise nicht auf die ursprünglichen Spalten angewendet wird. Bitte lesen Sie diese post. Es hat eine detaillierte Diskussion über diese SettingWithCopyWarning. In Ihrem Fall denke ich, Sie können versuchen

data.loc[data['name'] == 'fred', 'A'] = 0 
+1

Ich war dabei, die gleiche Sache zu posten. Ein logischer "One-Liner" ist besser als unnötige Linien. – tnknepp

+0

Sie haben Recht. Danke, dass du mich erinnert hast. –

+1

Gibt es keine direkte Möglichkeit, ein neues df mit den bearbeiteten Spalten zurückzugeben und das Original unverändert zu lassen? – user48956