2016-04-22 27 views
1

Mein Ziel ist es, die pct_change für zwei Zeilen innerhalb eines (2, 2) Multi-Index-Datenrahmens zu berechnen, aber ich möchte die pct_change Zeile unter den anderen zwei Zeilen erscheinen. Ich weiß über pct_change() Methode, aber das macht keine neue Zeile, stattdessen bin ich compact die pct_change als separate Datenrahmen und Anhängen der Zeile pct_change an einen vorhandenen Datenrahmen. Hier ist ein Beispieldatenrahmen.Python Pandas Multi-Index: Umbenennen bestimmter Index Zeile Wert

df = pd.DataFrame(data={ 
    'A': [94128, 28198, -70.04], 'B': [3627, 1483, -59.11]}, 
        index=pd.MultiIndex.from_tuples([('Label', '(Jun 1, 2014-Mar 31, 2015)'), 
                ('Label', '(Jun 1, 2015-Mar 31, 2016)'), 
                ('Label', '(Jun 1, 2015-Mar 31, 2016)')], 
                names=['Text', 'Period'])) 

sieht wie folgt aus:

          A  B 
Text Period          
Label (Jun 1, 2014-Mar 31, 2015) 94128.00 3627.00 
     (Jun 1, 2015-Mar 31, 2016) 28198.00 1483.00 
     (Jun 1, 2015-Mar 31, 2016) -70.04 -59.11 

Dies ist ein Multi-Index und ich möchte die letzte Period Zeilenwert umbenennen % Change zu sagen.

gewünschte Ausgabe:

          A  B 
Text Period          
Label (Jun 1, 2014-Mar 31, 2015) 94128.00 3627.00 
     (Jun 1, 2015-Mar 31, 2016) 28198.00 1483.00 
         % Change -70.04 -59.11 

Ist das, was angesichts seiner Multi-Index Komplexität Ich versuche sogar möglich, zu tun?

>>> df.index 
MultiIndex(levels=[['Label'], ['(Jun 1, 2014-Mar 31, 2015)', '(Jun 1, 2015-Mar 31, 2016)']], 
      labels=[[0, 0, 0], [0, 1, 1]], 
      names=['Text', 'Period']) 

Antwort

1

Ich glaube, Sie können zuerst get_level_values von Level Periodtolist, durch Indizierung [:-1] letzten Wert entfernen und neue Liste ['% Change'] hinzuzufügen. Die letzte neue MultiIndexfrom_tuples erstellen:

print df.index.get_level_values('Period')[:-1].tolist() + ['% Change'] 
['(Jun 1, 2014-Mar 31, 2015)', '(Jun 1, 2015-Mar 31, 2016)', '% Change'] 

#change multiindex 
new_index = zip(df.index.get_level_values('Text'), 
       df.index.get_level_values('Period')[:-1].tolist() + ['% Change']) 

df.index = pd.MultiIndex.from_tuples(new_index, names = df.index.names) 
print df 
             A  B 
Text Period          
Label (Jun 1, 2014-Mar 31, 2015) 94128.00 3627.00 
     (Jun 1, 2015-Mar 31, 2016) 28198.00 1483.00 
     % Change      -70.04 -59.11 

print df.index 
MultiIndex(levels=[[u'Label'], 
      [u'% Change', u'(Jun 1, 2014-Mar 31, 2015)', u'(Jun 1, 2015-Mar 31, 2016)']], 
      labels=[[0, 0, 0], [1, 2, 0]], 
      names=[u'Text', u'Period']) 
+0

Awesome! Ich musste 'list (zip (...))' für Python 3) verwenden, aber Ihr Ansatz ist sehr sinnvoll. Take-away bedeutet also, einen ganz neuen Index zu erstellen, der den Wert% Change enthält, und dann den aktuellen Multi-Index mit dem new_index zu ersetzen. – Jarad

Verwandte Themen