2014-11-19 5 views
7

pandas groupby будет по умолчанию сортировать. Но я бы хотел изменить порядок сортировки. Как я могу это сделать?pandas groupby сортировать по убыванию

Я предполагаю, что не могу применить метод сортировки к возвращенному объекту groupby.

+2

не ясный достаточно. нет примера, нет ожидаемого результата, нет, что вы сделали, и не знаете, что вы действительно спрашиваете. – acushner

+0

вы можете сортировать возвращаемый объект, преобразовывая его в dataframe. – szeitlin

ответ

5

От Pandas 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), но поскольку это недокументированная функция, это не очень приятно. [В документации указано] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html), что 'groupby' сохраняет порядок ключей * внутри * групп, но говорит не что иное, как отсортированы/несортированы для ключей самой группы. Я прав ? – Geeklhem

+0

хорошая точка ... много изменилось через 2 года, я обновлю ответ –

8

Сделайте свою группу и используйте функцию reset_index(), чтобы вернуть ее в DataFrame. Затем сортируйте.

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

Это отлично, сработало для меня. –

1

Другой пример сохранения порядка или сортировать по убыванию:

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

Вы можете сделать sort_values() на dataframe, прежде чем сделать 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 
Смежные вопросы