2015-09-02 16 views
5

Ich habe einen Pandas-Datenrahmen mit zwei Spalten: x und Wert. Ich möchte alle Zeilen mit x == 10 finden, und für alle diese Zeilen den Wert = 1.000. Ich habe versucht, den Code unten, aber ich die Warnung erhalten, dassPython Pandas: wie zu verkettete Zuordnung zu vermeiden

A value is trying to be set on a copy of a slice from a DataFrame. 

Ich verstehe ich dies durch die Verwendung .loc oder .ix vermeiden können, aber ich würde zuerst den Standort oder die Indizes aller Zeilen finden müssen, die treffen mein Zustand von x == 10. Gibt es einen direkteren Weg?

Danke!

import numpy as np 
import pandas as pd 

df=pd.DataFrame() 
df['x']=np.arange(10,14) 
df['value']=np.arange(200,204) 


print df 

df[ df['x']== 10 ]['value'] = 1000 # this doesn't work 

print df 
+2

Sorry, was ist falsch mit der empfohlenen 'df.loc [df ['x'] == 10, 'value'] = 1000'? – EdChum

+1

Danke, ich hatte nicht bemerkt, dass dies eine Option war. Vielleicht ist es nur ich, vielleicht liegt es daran, dass ich zu sehr an SQL gewöhnt bin und zu neu für Pandas bin, aber ich finde immer noch, dass einige in SQL banale Aufgaben in Pandas unordentlich sind und die Dokumentation nicht sehr klar ist –

+0

Die [docs] (http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy) sind ziemlich klar und die Warnung ist da, um Ihnen zu sagen, dass das, was Sie tun, möglicherweise nicht funktioniert – EdChum

Antwort

3

sollten Sie loc verwenden Sie gerade arbeiten im Hinblick auf die Gewährleistung auf Ihrem Beispiel die Folgenden wird eine Warnung arbeiten und nicht erhöhen:

df.loc[df['x'] == 10, 'value'] = 1000 

So die allgemeine Form ist:

df.loc[<mask or index label values>, <optional column>] = < new scalar value or array like> 

Die docs hebt die Fehler hervor und es gibt die intro, einige der Funktionsdokumente sind spärlich, fühlen sich frei, Verbesserungen einzureichen.