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)
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
@peer Überprüfen Sie die aktualisierte – Wen
funktioniert wieder! Vielen Dank! – peer