So aktualisieren Sie eine Teilmenge eines MultiIndexed pandas DataFrame

Ich verwende einen MultiIndexed pandas DataFrame und möchte eine Teilmenge des DataFrame mit einer bestimmten Zahl multiplizieren.

Es ist das gleiche wiediese aber mit einem MultiIndex.

>>> 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 = d.set_index(['year','flavour','day'])                  

>>> d
                     sales
year flavour    day       
2008 strawberry sat     10
                sun     12
     banana     sat     22
                sun     23
2009 strawberry sat     11
                sun     13
     banana     sat     23
                sun     24

So weit, ist es gut. Aber sagen wir, ich sehe, dass alle Samstagszahlen nur halb so hoch sind, wie sie sein sollten! Ich möchte alles multiplizierensat Umsatz um 2.

Mein erster Versuch war:

sat = d.xs('sat', level='day')
sat = sat * 2
d.update(sat)

das funktioniert aber nicht weil die variablesat hat das verlorenday Stand des Index:

>>> sat
                 sales
year flavour          
2008 strawberry     20
     banana         44
2009 strawberry     22
     banana         46

Daher weiß Pandas nicht, wie man die neuen Verkaufszahlen wieder in den alten Datenrahmen einfügt.

Ich hatte einen kurzen Stich auf:

>>> sat = d.xs('sat', level='day', copy=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 2248, in xs
    raise ValueError('Cannot retrieve view (copy=False)')
ValueError: Cannot retrieve view (copy=False)

Ich habe keine Ahnung, was dieser Fehler bedeutet, aber ich habe das Gefühl, aus einem Maulwurfshügel einen Berg zu machen. Kennt jemand den richtigen Weg, um dies zu tun?

Vielen Dank im Voraus, Rob

Antworten auf die Frage(2)

Ihre Antwort auf die Frage