pandas groupby будет по умолчанию сортировать. Но я бы хотел изменить порядок сортировки. Как я могу это сделать?pandas groupby сортировать по убыванию
Я предполагаю, что не могу применить метод сортировки к возвращенному объекту groupby.
pandas groupby будет по умолчанию сортировать. Но я бы хотел изменить порядок сортировки. Как я могу это сделать?pandas groupby сортировать по убыванию
Я предполагаю, что не могу применить метод сортировки к возвращенному объекту groupby.
От 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 по умолчанию, который восходящим.
Ну, похоже, это работает (Pandas 0.17.1), но поскольку это недокументированная функция, это не очень приятно. [В документации указано] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html), что 'groupby' сохраняет порядок ключей * внутри * групп, но говорит не что иное, как отсортированы/несортированы для ключей самой группы. Я прав ? – Geeklhem
хорошая точка ... много изменилось через 2 года, я обновлю ответ –
Сделайте свою группу и используйте функцию reset_index(), чтобы вернуть ее в DataFrame. Затем сортируйте.
grouped = df.groupby('mygroups').sum().reset_index()
grouped.sort_values('mygroups', ascending=False)
Это отлично, сработало для меня. –
Другой пример сохранения порядка или сортировать по убыванию:
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
Вы можете сделать 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
не ясный достаточно. нет примера, нет ожидаемого результата, нет, что вы сделали, и не знаете, что вы действительно спрашиваете. – acushner
вы можете сортировать возвращаемый объект, преобразовывая его в dataframe. – szeitlin