2016-07-29 7 views
0

Nach dem groupby wird die Ausgabe-Reihenfolge der Gruppe im Voraus festgelegt. Im folgenden Fall lautet die Reihenfolge A, AAA, B, BBB.Hat die Reihenfolge der groupby output entschieden?

Gibt es eine Möglichkeit, diese Bestellung anzupassen? Ich möchte bestellen AAA, A, BBB, B. Ich könnte es auch in anderen Ordnungen wünschen.

import pandas as pd 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
%matplotlib inline 
data=pd.DataFrame({'Rating':['A','AAA','B','BBB','A','AAA','B','BBB'], 
        'Score':[2,4,5,6,2,4,5,6,]}) 
t=data.groupby('Rating', sort=False)['Score'].mean() 
t 
Rating 
A  2 
AAA 4 
B  5 
BBB 6 
Name: Score, dtype: int64 

Antwort

2

Sie können den Auftrag von groupby/Mittelwert zurück ändern (außer dem, was mit dem sort Parameter möglich ist,). Allerdings ist es leicht, die Reihenfolge nach der Tat reindex Verwendung ändern:

In [24]: data.groupby('Rating', sort=False)['Score'].mean().reindex(['AAA', 'A', 'BBB', 'B']) 
Out[24]: 
Rating 
AAA 4 
A  2 
BBB 6 
B  5 
Name: Score, dtype: int64 

Alternativ können Sie die Reihenfolge von groupby/mean zurück steuern, indem Ratings zu einem Categorical Wechsel:

import pandas as pd 

data = pd.DataFrame({'Rating':['A','AAA','B','BBB','A','AAA','B','BBB'], 
        'Score':[2,4,5,6,2,4,5,6,]}) 
data['Rating'] = pd.Categorical(data['Rating'], categories=['AAA','A','BBB','B'], 
           ordered=True) 
result = data.groupby('Rating', sort=False)['Score'].mean() 
print(result) 

ergeben

Rating 
AAA 4 
A  2 
BBB 6 
B  5 
Name: Score, dtype: int64 
0

sort=False bedeutet nur, dass es nicht zu sortier ist garantiert (es bestellt werden kann). Meine Erinnerung ist, dass dies in der "gesehenen Reihenfolge" ist, aber auch das ist nicht garantiert.

Um die Ausgabe eines groupby zu sortieren, machen nur die Art nach (durch den Index):

In [11]: t.sort_index() 
Out[11]: 
Rating 
A  2 
AAA 4 
B  5 
BBB 6 
Name: Score, dtype: int64 
+0

Hmmm, ich sehe das nicht sortieren in 'AAA, A, BBB, B', aber ich bin mir nicht sicher, wie Sie das ohne manuelle Neuindizierung tun können (wie @ unutbus Antwort). –