2016-03-19 13 views
1

Ich habe ein Datenframe mit hierarchischen Zeilen, die das Ergebnis einer transponierten Pivot ist. Der Index der zweiten Zeile ist eine Zahl und wird in aufsteigender Reihenfolge sortiert (was ich will), aber der Index der ersten Zeile ist ein String und wird alphabetisch sortiert (was ich nicht will). In ähnlicher Weise sind die Spaltennamen Strings und alphabetisch sortiert, was ich nicht möchte.Pandas: Pivot mit Zeilen und Spalten in einer bestimmten Reihenfolge

Wie kann ich den Datenrahmen so reorganisieren, dass Zeilen und Spalten in der gewünschten Reihenfolge angezeigt werden? Die einzige Sache, die ich davon habe, ist, sie umzubenennen, am Anfang eine Zahl hinzufügend, aber es ist chaotisch, und ich würde es lieber vermeiden, wenn möglich.

Ein minimales Beispiel dafür, wie meine Daten aussehen, ist unten. Für die Moderatoren: Ich verstehe, dass ähnliche Fragen gestellt wurden, aber ich konnte keine dieser Lösungen auf meinen Multi-Index anwenden.

import pandas as pd 
import numpy as np 

consdf=pd.DataFrame() 

for mylocation in ['North','South']: 
    for scenario in np.arange(1,4): 
     df= pd.DataFrame() 
     df['mylocation'] = [mylocation] 
     df['scenario']= [scenario] 
     df['this'] = np.random.randint(10,100) 
     df['that'] = df['this'] * 2 
     df['something else'] = df['this'] * 3 
     consdf=pd.concat((consdf, df), axis=0, ignore_index=True) 

mypiv = consdf.pivot('mylocation','scenario').transpose() 
+0

Sie halten über die Reihenfolge, sprechen Sie wollen, aber nie erklären, was das ist: im Auftrag des ersten Auftretens im Dataset , könnte sein? (Auch in Ihrem Beispiel ist die erste Spalte des Indexes * nicht * alphabetisch nach dem Drehpunkt sortiert: ich bekomme "dieses", "das", "etwas anderes", nicht "etwas anderes", "das" , "this" '. Was vermisse ich?) – DSM

+0

Sorry, wenn ich unklar war. In meinem tatsächlichen Code ist mylocation eine geordnete Sammlung, daher möchte ich, dass die Ergebnisse in der gleichen Reihenfolge angezeigt werden, in der ich Objekte zum Objekt hinzugefügt habe. Was die Zeilen betrifft, möchte ich sie in einer Reihenfolge, die ich vorschlage, sagen: Ich habe eine Liste mit der gewünschten Reihenfolge, und ich möchte sie anwenden. Danke vielmals –

Antwort

2

Die Funktion reindex dafür ist, passen nur Spalten verwalten:

In [1]: mypiv 
Out[1]: 
mylocation    North South 
       scenario    
this   1   24  11 
       2   19  53 
       3   11  92 
that   1   48  22 
       2   38 106 
       3   22 184 
something else 1   72  33 
       2   57 159 
       3   33 276 


In [2]: mypiv.reindex(['that', 'this', 'something else'], level=0) \ 
.T.reindex(['South','North']).T 
Out[2]: 
mylocation    South North 
       scenario    
that   1   90  34 
       2   50 104 
       3   100 170 
this   1   45  17 
       2   25  52 
       3   50  85 
something else 1   135  51 
       2   75 156 
       3   150 255 
Verwandte Themen