2014-11-19 5 views
7

기본적으로 pandas groupby가 정렬됩니다. 하지만 정렬 순서를 변경하고 싶습니다. 어떻게해야합니까?pandas groupby 내림차순 정렬

반환 된 groupby 개체에 정렬 메서드를 적용 할 수 없다고 생각합니다.

+2

충분히 명확하지 않습니다. 예를 들어, 예상 된 결과가 없습니다, 당신이 한 일이 없습니다. 당신이 정말로 묻고있는 것을 알 수있는 방법이 없습니다. – acushner

+0

반환 된 객체를 데이터 프레임으로 변환하여 정렬 할 수 있습니다. – szeitlin

답변

5

팬더 0.18에서이 작업을 수행하는 한 가지 방법은 그룹화 된 데이터의 sort_index 메서드를 사용하는 것입니다. 당신이 볼 수 있듯이

np.random.seed(1) 
n=10 
df = pd.DataFrame({'mygroups' : np.random.choice(['dogs','cats','cows','chickens'], size=n), 
        'data' : np.random.randint(1000, size=n)}) 

grouped = df.groupby('mygroups', sort=False).sum() 
grouped.sort_index(ascending=False) 
print grouped 

data 
mygroups  
dogs  1831 
chickens 1446 
cats  933 

에서, GROUPBY 열이 지금 상승되는 기본의 indstead 내림차순으로 정렬됩니다 :

다음은 예입니다.

+0

잘 작동하는 것처럼 보입니다 (Pandas 0.17.1). 문서화되지 않은 기능이므로 매우 만족스럽지 않습니다. [documentation은] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html)'groupby'는 keys * 내에서 그룹의 순서를 유지하지만 아무 것도 말하지 않는다고 말합니다 그룹 키의 정렬/정렬되지 않은 키. 내가 맞습니까? – Geeklhem

+0

좋은 지적 ... 많은 것이 2 년 후에 변했고, 나는 대답을 업데이트 할 것이다 –

8

groupby를 수행하고 reset_index()를 사용하여 DataFrame으로 되돌립니다. 그럼 정렬. 내림차순으로 순서 나 종류를 보존

grouped = df.groupby('mygroups').sum().reset_index() 
grouped.sort_values('mygroups', ascending=False) 
+1

이것은 나에게 잘 맞았다. –

1

다른 예 : 당신이 GROUPBY을하기 전에

In [97]: import pandas as pd                          

In [98]: df = pd.DataFrame({'name':['A','B','C','A','B','C','A','B','C'],'Year':[2003,2002,2001,2003,2002,2001,2003,2002,2001]}) 

#### Default groupby operation: 
In [99]: for each in df.groupby(["Year"]): print each                   
(2001, Year name 
2 2001 C 
5 2001 C 
8 2001 C) 
(2002, Year name 
1 2002 B 
4 2002 B 
7 2002 B) 
(2003, Year name 
0 2003 A 
3 2003 A 
6 2003 A) 

### order preserved: 
In [100]: for each in df.groupby(["Year"], sort=False): print each                
(2003, Year name 
0 2003 A 
3 2003 A 
6 2003 A) 
(2002, Year name 
1 2002 B 
4 2002 B 
7 2002 B) 
(2001, Year name 
2 2001 C 
5 2001 C 
8 2001 C) 

In [106]: df.groupby(["Year"], sort=False).apply(lambda x: x.sort_values(["Year"]))       
Out[106]: 
     Year name 
Year    
2003 0 2003 A 
    3 2003 A 
    6 2003 A 
2002 1 2002 B 
    4 2002 B 
    7 2002 B 
2001 2 2001 C 
    5 2001 C 
    8 2001 C 

In [107]: df.groupby(["Year"], sort=False).apply(lambda x: x.sort_values(["Year"])).reset_index(drop=True) 
Out[107]: 
    Year name 
0 2003 A 
1 2003 A 
2 2003 A 
3 2002 B 
4 2002 B 
5 2002 B 
6 2001 C 
7 2001 C 
8 2001 C 
1

당신은 dataframe에 sort_values() 할 수 있습니다. 팬더는 groupby에서 주문을 보존합니다.

In [44]: d.head(10) 
Out[44]: 
       name transcript exon 
0 ENST00000456328   2  1 
1 ENST00000450305   2  1 
2 ENST00000450305   2  2 
3 ENST00000450305   2  3 
4 ENST00000456328   2  2 
5 ENST00000450305   2  4 
6 ENST00000450305   2  5 
7 ENST00000456328   2  3 
8 ENST00000450305   2  6 
9 ENST00000488147   1 11 

for _, a in d.head(10).sort_values(["transcript", "exon"]).groupby(["name", "transcript"]): print(a) 
       name transcript exon 
1 ENST00000450305   2  1 
2 ENST00000450305   2  2 
3 ENST00000450305   2  3 
5 ENST00000450305   2  4 
6 ENST00000450305   2  5 
8 ENST00000450305   2  6 
       name transcript exon 
0 ENST00000456328   2  1 
4 ENST00000456328   2  2 
7 ENST00000456328   2  3 
       name transcript exon 
9 ENST00000488147   1 11