2017-12-26 4 views
1

ich einen Datenrahmen wie dieses:Sortieren 2 Index Pivot-Tabelle: Werte innerhalb der Gruppe, Index basieren auf Werten,

x = pd.DataFrame({'col1':['bul', 'eng','eng', 'ger','ger', 'fra','fra'], 
        'col2':['fra', 'ger','fra', 'fra','eng', 'ger','eng'], 
        'col3':[ 1,  4, 2,  6, 7, 20, 5]}) 
pt = pd.pivot_table(x, index = ['col1', 'col2'], values = 'col3', aggfunc = np.sum) 
pt 
      col3 
col1 col2  
bul fra  1 
eng fra  2 
    ger  4 
fra eng  5 
    ger  20 
ger eng  7 
    fra  6 

, die ich bei sortieren möchten ankommen:

  col3 
col1 col2  
fra ger  20 
    eng  5 
ger eng  7 
    fra  6 
eng ger  4 
    fra  2 
bul fra  1 

die dritte Spalte wird absteigend sortiert (in Spalte1) und Spalte1 sortiert nach einer Eigenschaft von Spalte3, hier max (20> 7> 4> 1)

Es gibt mehrere Fragen, die sich befassen mit ähnlichen Problemen, ist mein relevant, weil es einen beschreibenden Titel und Beispieldaten (auch andere Fragen Antworten für mich nicht funktionieren) verfügt

https://stackoverflow.com/a/45300480/3014199 schlägt

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

print(df) 
      col3 
col1 col2  
bul fra  1 
eng fra  2 
    ger  4 
fra eng  5 
ger fra  6 
    eng  7 
fra ger  20 

Welche col3 für den Datenrahmen dort zu sortieren scheint , scheint aber für meine Daten überhaupt nicht zu funktionieren.

Pandas: Sort pivot table scheint auch viel versprechend, aber wie andere, die ich ValueError: all keys need to be the same shape

-Update erhalten:
Mein Beispiel war genug, um nicht allgemein, sorry! Es sollte auch funktionieren, wenn 2 Gruppen das gleiche Maximum teilen, z.B.

x2 = pd.DataFrame({'col1':['bul', 'eng','eng', 'ger','ger', 'fra','fra'], 
        'col2':['fra', 'ger','fra', 'fra','eng', 'ger','eng'], 
        'col3':[ 1,  7, 2,  6, 7, 20, 5]}) 

z. MAXU-Lösung ergibt:

  col3 
col1 col2   
fra ger 20 
    eng 5 
ger eng 7 
eng ger 7 
ger fra 6 
eng fra 2 
bul fra 1 

Ich wette, das Hinzufügen eines Hash (oder besser gesagt eine Gruppierung Zahl geteilt durch 10) von col1 auf die ‚max‘ funktionieren würde, aber es muss sein, einen besseren Weg ...
Ja ! Dies scheint zu funktionieren:

pt['New']=pt.groupby(level='col1').col3.transform('max') 
pt['New'] = 1/(pt.index.labels[0]+1)+pt['New'].values 
pt=pt.sort_values(['New','col3'],ascending=False).drop('New',1) 

Antwort

3

Wir haben eine neue para verwenden, können diese

pt['New']=pt.groupby(level='col1').col3.transform('max') 
pt=pt.sort_values(['New','col3'],ascending=False).drop('New',1) 
pt 
Out[1445]: 
      col3 
col1 col2  
fra ger  20 
    eng  5 
ger eng  7 
    fra  6 
eng ger  4 
    fra  2 
bul fra  1 

Aktualisiert zu erreichen:

pt['New']=pt.groupby(level='col1').col3.transform('max') 
pt['New1']=pt.groupby(level='col1').col3.ngroup() 
pt=pt.sort_values(['New','New1','col3'],ascending=False) 


pt 
Out[151]: 
      col3 New New1 
col1 col2     
fra ger  20 20  2 
    eng  5 20  2 
ger eng  7 7  3 
    fra  6 7  3 
eng ger  7 7  1 
    fra  2 7  1 
bul fra  1 1  0 
+0

Ich habe gerade versucht, dies auf andere Daten (ersetzt 4 mit 7) und es funktioniert nicht, wenn 2 Gruppen max gleich sind. Siehe Anhang zu meiner Frage. – peer

+0

@peer Überprüfen Sie die aktualisierte – Wen

+0

funktioniert wieder! Vielen Dank! – peer

2

Hier ist eine Lösung sehr ähnlich Wen die set_index verwendet, sort_index und reset_index:

In [188]: (pt.set_index([pt.groupby(level='col1').col3.transform('max'), pt['col3']], append=True) 
    ...: .sort_index(level=[2,3], ascending=False) 
    ...: .reset_index(level=[2,3], drop=True) 
    ...:) 
    ...: 
Out[188]: 
      col3 
col1 col2 
fra ger  20 
    eng  5 
ger eng  7 
    fra  6 
eng ger  4 
    fra  2 
bul fra  1 
+1

Das ist noch nicht was ich brauche, Col3 sollte absteigend sein, aber hier ist 5 über 20 und 7 ist über 6. Ich habe versucht, mit 'aufsteigender' herumzutüfteln, aber ich kann es nicht selbst reparieren – peer

+0

@peer, sollte jetzt behoben werden - bitte überprüfen ... – MaxU

+0

funktioniert, vielen Dank! – peer

Verwandte Themen