2013-07-18 6 views
25

Dies ist eine ziemlich ähnliche Frage zu this question, aber mit einem Schlüssel Unterschied: Ich wähle die Daten, die ich nicht durch ihren Index, sondern durch einige Kriterien ändern möchte.Ersetze Wert für eine ausgewählte Zelle in Pandas DataFrame ohne Index

Wenn die Kriterien I eine einzelne Zeile anwenden zurückzukehren, würde ich erwarten, dass der Wert einer bestimmten Spalte in dieser Zeile auf einfache Art und Weise in der Lage sein zu setzen, aber mein erster Versuch nicht funktioniert:

>>> d = pd.DataFrame({'year':[2008,2008,2008,2008,2009,2009,2009,2009], 
...     'flavour':['strawberry','strawberry','banana','banana', 
...     'strawberry','strawberry','banana','banana'], 
...     'day':['sat','sun','sat','sun','sat','sun','sat','sun'], 
...     'sales':[10,12,22,23,11,13,23,24]}) 

>>> d 
    day  flavour sales year 
0 sat strawberry  10 2008 
1 sun strawberry  12 2008 
2 sat  banana  22 2008 
3 sun  banana  23 2008 
4 sat strawberry  11 2009 
5 sun strawberry  13 2009 
6 sat  banana  23 2009 
7 sun  banana  24 2009 

>>> d[d.sales==24] 
    day flavour sales year 
7 sun banana  24 2009 

>>> d[d.sales==24].sales = 100 
>>> d 
    day  flavour sales year 
0 sat strawberry  10 2008 
1 sun strawberry  12 2008 
2 sat  banana  22 2008 
3 sun  banana  23 2008 
4 sat strawberry  11 2009 
5 sun strawberry  13 2009 
6 sat  banana  23 2009 
7 sun  banana  24 2009 

Also, anstatt die Bananenverkäufe von Sonntag am Sonntag auf 100 zu setzen, passiert nichts! Was ist der beste Weg, dies zu tun? Idealerweise sollte die Lösung die Zeilennummer verwenden, da Sie dies normalerweise nicht im Voraus wissen!

Vielen Dank im Voraus, Rob

Antwort

40

viele Möglichkeiten, dass

In [7]: d.sales[d.sales==24] = 100 

In [8]: d 
Out[8]: 
    day  flavour sales year 
0 sat strawberry  10 2008 
1 sun strawberry  12 2008 
2 sat  banana  22 2008 
3 sun  banana  23 2008 
4 sat strawberry  11 2009 
5 sun strawberry  13 2009 
6 sat  banana  23 2009 
7 sun  banana 100 2009 
In [26]: d.loc[d.sales == 12, 'sales'] = 99 

In [27]: d 
Out[27]: 
    day  flavour sales year 
0 sat strawberry  10 2008 
1 sun strawberry  99 2008 
2 sat  banana  22 2008 
3 sun  banana  23 2008 
4 sat strawberry  11 2009 
5 sun strawberry  13 2009 
6 sat  banana  23 2009 
7 sun  banana 100 2009 
In [28]: d.sales = d.sales.replace(23, 24) 

In [29]: d 
Out[29]: 
    day  flavour sales year 
0 sat strawberry  10 2008 
1 sun strawberry  99 2008 
2 sat  banana  22 2008 
3 sun  banana  24 2008 
4 sat strawberry  11 2009 
5 sun strawberry  13 2009 
6 sat  banana  24 2009 
7 sun  banana 100 2009 
zu tun
+1

Ja! Lösung 1. hat funktioniert. So kontraintuitiv, dass das funktioniert: 'd.sales [d.sales == 24] = 100' aber das ist nicht:' d [d.sales == 24] .sales = 100'. Sie sehen (funktional) so aus, dass sie für mich gleich sind. Ah, gut. Danke @waitingkuo. – LondonRob

+1

d [d.sales == 24] erzeuge ein neues Objekt. – waitingkuo

+1

re. @ Wartingkuo's Kommentar: Ist das erwartetes Verhalten, Pandas Jungs? Sicher nicht intuitiv, dass 'd [d.sales == 24]' eine Kopie des ursprünglichen 'DataFrame' erzeugen sollte. In der Tat würde ich sagen, dass jedes Objekt eine Referenz auf das Original sein sollte (einschließlich der Auswahl einer einzelnen Zeile, die korrekt zu einer Pandas 'Serie' kollabiert), es sei denn, dies wird explizit vom Benutzer angefordert (über eine Art Kopie) = Wahr "). Gedanken? – LondonRob

6

Nicht sicher über ältere Version von Pandas, aber in 0,16 kann der Wert einer bestimmten Zelle basierend auf mehreren Spaltenwerten festgelegt werden.

Erweitern der Antwort von @waitingkuo, kann die gleiche Operation auch basierend auf den Werten mehrerer Spalten durchgeführt werden.

d.loc[(d.day== 'sun') & (d.flavour== 'banana') & (d.year== 2009),'sales'] = 100 
Verwandte Themen