【发布时间】:2015-01-17 01:49:40
【问题描述】:
pandas groupby 默认会排序。但我想更改排序顺序。我该怎么做?
我猜我无法对返回的 groupby 对象应用排序方法。
【问题讨论】:
-
您可以通过将返回的对象转换为数据框来对其进行排序。
pandas groupby 默认会排序。但我想更改排序顺序。我该怎么做?
我猜我无法对返回的 groupby 对象应用排序方法。
【问题讨论】:
类似于上述答案之一,但尝试将.sort_values() 添加到您的.groupby() 将允许您更改排序顺序。如果您需要对单个列进行排序,则如下所示:
df.groupby('group')['id'].count().sort_values(ascending=False)
ascending=False会从高到低排序,默认是从低到高排序。
*小心其中一些聚合。例如 .size() 和 .count() 返回不同的值,因为 .size() 计算 NaN。
【讨论】:
这种操作包含在分层索引中。 Check out the examples here
当你分组时,你正在制作新的索引。如果您还通过 .agg() 传递列表。你会得到多列。我试图弄清楚这一点,并通过谷歌找到了这个线程。
事实证明,如果您传递一个与您想要排序的确切列相对应的元组。
试试这个:
# generate toy data
ex = pd.DataFrame(np.random.randint(1,10,size=(100,3)), columns=['features', 'AUC', 'recall'])
# pass a tuple corresponding to which specific col you want sorted. In this case, 'mean' or 'AUC' alone are not unique.
ex.groupby('features').agg(['mean','std']).sort_values(('AUC', 'mean'))
这将输出仅按 AUC-mean 列排序的 df。
【讨论】:
您可以在执行 groupby 之前对数据框执行 sort_values()。 Pandas 将排序保留在 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
【讨论】:
其他保留顺序或降序排序的实例:
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
【讨论】:
做你的 groupby,并使用 reset_index() 使它回到 DataFrame 中。然后排序。
grouped = df.groupby('mygroups').sum().reset_index()
grouped.sort_values('mygroups', ascending=False)
【讨论】:
从 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 列现在按降序排序,而不是默认的升序。
【讨论】:
groupby 保留 within 组中的键的顺序,但仅表示组本身的键已排序/未排序。我说的对吗?