Sorting 按降序排序
默认情况下,pandas groupby将进行排序。但是我想更改分拣顺序。我该怎么做Sorting 按降序排序,sorting,pandas,Sorting,Pandas,默认情况下,pandas groupby将进行排序。但是我想更改分拣顺序。我该怎么做 我猜我无法对返回的groupby对象应用排序方法。从0.18开始,一种方法是使用分组数据的排序索引方法 下面是一个例子: np.random.seed(1) n=10 df = pd.DataFrame({'mygroups' : np.random.choice(['dogs','cats','cows','chickens'], size=n), 'data' : n
我猜我无法对返回的groupby对象应用排序方法。从0.18开始,一种方法是使用分组数据的
排序索引方法
下面是一个例子:
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列现在按降序排序,而不是按默认值升序排序 进行分组,并使用reset_index()将其返回到数据帧中。然后分类
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
在执行groupby之前,可以对数据帧执行排序\u 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
这种操作包含在层次索引中
当你分组时,你正在制作新的索引。如果还通过.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平均值列排序的df。与上面的一个答案类似,但请尝试将添加到您的中。groupby()
将允许您更改排序顺序。如果需要对单个列进行排序,它将如下所示:
df.groupby('group')['id'].count().sort_values(ascending=False)
ascending=False
将从高到低排序,默认为从低到高排序
*小心这些聚合。例如,.size()和.count()返回不同的值,因为.size()计算N
您可以通过将返回的对象转换为数据帧来对其进行排序。这似乎是可行的(Pandas 0.17.1),但由于它是一个未记录的功能,因此并不十分令人满意。groupby
保留组中键的顺序,但只表示组中键本身已排序/未排序。我说的对吗?很好。。。在2年内,批次发生了变化,我将更新答案。如果执行聚合,然后根据聚合结果排序,会怎么样?