2017-07-25 6 views
2

Ich versuche, die Werte einer Pivot-Tabelle in absteigender Reihenfolge nach dem Platzieren von zwei "Zeilenbeschriftungen" (Excel-Ausdruck) auf dem Pivot zu sortieren.Sortieren Pivot-Tabelle (Multi-Index)

Beispieldaten:

x = pd.DataFrame({'col1':['a','a','b','c','c', 'a','b','c', 'a','b','c'], 
        'col2':[ 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3], 
        'col3':[ 1,.67,0.5, 2,.65, .75,2.25,2.5, .5, 2,2.75]}) 
print(x) 
    col1 col2 col3 
0  a  1 1.00 
1  a  1 0.67 
2  b  1 0.50 
3  c  1 2.00 
4  c  1 0.65 
5  a  2 0.75 
6  b  2 2.25 
7  c  2 2.50 
8  a  3 0.50 
9  b  3 2.00 
10 c  3 2.75 

die Pivot zu erstellen, ich die folgende Funktion bin mit:

pt = pd.pivot_table(x, index = ['col1', 'col2'], values = 'col3', aggfunc = np.sum) 
print(pt) 
      col3 
col1 col2  
a 1  1.67 
    2  0.75 
    3  0.50 
b 1  0.50 
    2  2.25 
    3  2.00 
c 1  2.65 
    2  2.50 
    3  2.75 

In Worten, diese Variable pt zuerst von col1 sortiert, dann durch die Werte von col2 innerhalb von col1 dann von col3 innerhalb all dieser. Das ist großartig, aber ich würde gerne nach col3 sortieren (die Werte), während die Gruppen behalten werden, die in col2 ausgebrochen sind (diese Spalte kann irgendeine Reihenfolge sein und gemischt werden).

würde Ziel Ausgang wie folgt aussehen (col3 um mit einer beliebigen Reihenfolge in col2 mit dieser Gruppe von col1 in absteigender Reihenfolge):

    col3 
    col1 col2  
    a  1  1.67 
      2  0.75 
      3  0.50 

    b  2  2.25 
      3  2.00 
      1  0.50 

    c  3  2.75 
      1  2.65 
      2  2.50 

habe ich versucht, den Code unten, aber diese sortiert nur den gesamten Dreh Tabellenwerte und verliert die Gruppierung (ich suche nach der Sortierung innerhalb der Gruppe).

pt.sort_values(by = 'col3', ascending = False) 

Zur Orientierung wurde eine ähnliche Frage gestellt (und beantwortete) hier, aber ich war nicht in der Lage einen erfolgreichen Ausgang mit der mitgelieferten Ausgabe zu erhalten:

Pandas: Sort pivot table

Der Fehler, den ich von dem bekommen Antwort ValueError: all keys need to be the same shape

Antwort

1

Sie benötigen reset_index für DataFrame, dann sort_values von col1 und col3 und letzten set_index für MultiIndex:

df = df.reset_index() 
     .sort_values(['col1','col3'], ascending=[True, False]) 
     .set_index(['col1','col2']) 

print (df) 
      col3 
col1 col2  
a 1  1.67 
    2  0.75 
    3  0.50 
b 2  2.25 
    3  2.00 
    1  0.50 
c 3  2.75 
    1  2.65 
    2  2.50