2016-05-19 31 views
1

Angenommen, ich habe ein Dataframe df und verwendet groupby darauf. Wie kann ich diese Gruppen sortieren? Ich hätte gerne die Gruppe mit dem höchsten Median in Spalte B zuerst, die mit dem niedrigsten Median zuletzt. Ich weiß, wie der Median sortiert erhalten:wie Pandas Gruppen basierend auf einem Aggregat

df.groupby(by='A')['B'].median().sort_values(ascending=False) 

Aber wie würde ich sortieren eigentlich die Gruppen (nicht deren Median)?

+0

Gruppen sind Alpha standardmäßig sortiert. Sie können wählen, nicht wie 'df.groupby (' A ', sort = False) 'zu sortieren, was zu einer etwas besseren Leistung führt. – Alexander

+0

Und es gibt keine Möglichkeit, Gruppen anders zu sortieren? Ich bereite hier einen Boxplot vor, also möchte ich eine Gruppe pro Box haben und trotzdem möchte ich die Position der Boxen auf der x-Achse ändern (genau, ich möchte sie nach 'Wichtigkeit' sortieren, was in dieser Spalte B angegeben ist) – brina

+0

Das bedeutet, dass Sie nach Werten sortieren, wie von @EdChum unten gezeigt. – Alexander

Antwort

0

Sie die index aus dem Ergebnis der sort_values zum Indizieren der Gruppe verwenden können:

In [118]: 
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc')) 
df['group'] = list('aabcc') 
df 

Out[118]: 
      a   b   c group 
0 3.260645 -0.636861 0.183312  a 
1 -0.409939 1.915902 -2.426166  a 
2 -0.522152 1.621288 0.225874  b 
3 0.576484 0.499148 -1.037899  c 
4 0.626081 0.040262 -1.679669  c 

In [128]:  
gp = df.groupby('group')['a'].median() 
gp 

Out[128]: 
group 
a 1.425353 
b -0.522152 
c 0.601282 
Name: a, dtype: float64 

In [134]: 
order = gp.sort_values(ascending=False) 
order 

Out[134]: 
group 
a 1.425353 
c 0.601282 
b -0.522152 
Name: a, dtype: float64 

In [135]:  
gp[order.index] 

Out[135]: 
group 
a 1.425353 
c 0.601282 
b -0.522152 
Name: a, dtype: float64 

EDIT

Wenn Sie die Sortierreihenfolge auf mittlere Basis verwenden möchten, können Sie die mittlere Spalte hinzufügen zurück zum ursprünglichen df unter Verwendung transform und sortieren dann das ursprüngliche df:

In [7]: 
df['median'] = df.groupby('group')['a'].transform('median') 
df 

Out[7]: 
      a   b   c group median 
0 3.260645 -0.636861 0.183312  a 1.425353 
1 -0.409939 1.915902 -2.426166  a 1.425353 
2 -0.522152 1.621288 0.225874  b -0.522152 
3 0.576484 0.499148 -1.037899  c 0.601282 
4 0.626081 0.040262 -1.679669  c 0.601282 

In [9]:  
df.loc[df['median'].sort_values(ascending=False).index] 

Out[9]: 
      a   b   c group median 
1 -0.409939 1.915902 -2.426166  a 1.425353 
0 3.260645 -0.636861 0.183312  a 1.425353 
4 0.626081 0.040262 -1.679669  c 0.601282 
3 0.576484 0.499148 -1.037899  c 0.601282 
2 -0.522152 1.621288 0.225874  b -0.522152 
+0

Danke, das zeigt in die richtige Richtung. Allerdings beantwortet es meine komplette Frage nicht wie am Ende, (aus [135]) es sind immer noch die Mediane, die nicht die Gruppen sortiert haben. I.e. Ich möchte etwas wie 'df.groupby ('group') [order.index]' machen, um die Gruppen (und alle ihre Werte) zu sortieren, aber das funktioniert nicht für mich ('Spalten nicht gefunden'). Irgendwelche Vorschläge? – brina

+0

@brina Vorschlag: füge eine Spalte mit einem Gruppenmedian hinzu, sortiere "df" danach und gruppiere dann erneut mit "sort = False". – ptrj

Verwandte Themen