sze*_*lin 27
做你的groupby,并使用reset_index()将其重新导入DataFrame.然后排序.
grouped = df.groupby('mygroups').sum().reset_index()
grouped.sort_values('mygroups', ascending=False)
Run Code Online (Sandbox Code Playgroud)
小智 15
类似于上面的答案之一,但尝试添加.sort_values()到您的.groupby()将允许您更改排序顺序。如果您需要对单列进行排序,则如下所示:
df.groupby('group')['id'].count().sort_values(ascending=False)
Run Code Online (Sandbox Code Playgroud)
ascending=False 会从高到低排序,默认是从低到高排序。
*小心这些聚合中的一些。例如 .size() 和 .count() 返回不同的值,因为 .size() 计算 NaN。
JD *_*ong 12
从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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,groupby列现在按降序排序,而不是默认的升序.
您可以sort_values()在执行 groupby 之前对数据框执行 a 。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
Run Code Online (Sandbox Code Playgroud)
小智 6
分层索引涵盖了此类操作。查看此处的示例
当你进行分组时,你正在创建新的索引。如果你还通过.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'))
Run Code Online (Sandbox Code Playgroud)
这将输出仅按 AUC 均值列排序的 df。
保留顺序或按降序排序的其他实例:
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
Run Code Online (Sandbox Code Playgroud)