2016-07-29 24 views
0

在groupby之後,組的輸出順序是預先決定的。在以下情況下,訂單爲A,AAA,B,BBB。決定組輸出的順序?

有沒有辦法自定義這個訂單?我想要成爲AAA,A,BBB,B。我可能也想要其他訂單。

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 

回答

2

您不能更改GROUPBY /平均值(返回的順序保存什麼是可能與sort參數)。然而,很容易使用reindex改變這個事實後的順序:

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 

或者,您也可以通過改變RatingsCategorical控制由groupby/mean返回的順序:

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) 

產生

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

sort=False只是意味着它不能保證排序(它可能是有序的)。我的回憶是,這是在「看到的順序」,但再次不能保證。

要排序GROUPBY的輸出,只是做排序後(通過索引):

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

嗯,我看到這並不排序到'AAA,A,BBB,B',但我不知道你如何做到這一點,而不需要手工重新編譯(如@ unutbu的答案)。 –