我想按两列对我的数据帧进行分组,然后在组中对聚合结果进行排序。
In [167]:
df
Out[167]:
count job source
0 2 sales A
1 4 sales B
2 6 sales C
3 3 sales D
4 7 sales E
5 5 market A
6 3 market B
7 2 market C
8 4 market D
9 1 market E
In [168]:
df.groupby(['job','source']).agg({'count':sum})
Out[168]:
count
job source
market A 5
B 3
C 2
D 4
E 1
sales A 2
B 4
C 6
D 3
E 7
现在,我想在每个组中按降序对count列进行排序。然后只取最上面的三行。要获得类似如下的内容:
count
job source
market A 5
D 4
B 3
sales E 7
C 6
B 4
发布于 2015-01-08 23:46:41
您要做的实际上又是一个groupby (在第一个groupby的结果上):对每个组的前三个元素进行排序和取值。
从第一个groupby的结果开始:
In [60]: df_agg = df.groupby(['job','source']).agg({'count':sum})
我们按索引的第一级进行分组:
In [63]: g = df_agg['count'].groupby('job', group_keys=False)
然后,我们要对每个组进行排序('order'),并获取前三个元素:
In [64]: res = g.apply(lambda x: x.sort_values(ascending=False).head(3))
但是,有一个快捷函数可以完成此任务,即nlargest
In [65]: g.nlargest(3)
Out[65]:
job source
market A 5
D 4
B 3
sales E 7
C 6
B 4
dtype: int64
因此,这看起来是这样的:
df_agg['count'].groupby('job', group_keys=False).nlargest(3)
发布于 2016-03-18 09:20:50
您也可以一气呵成,首先进行排序,然后使用head获取每组的前3个。
In[34]: df.sort_values(['job','count'],ascending=False).groupby('job').head(3)
Out[35]:
count job source
4 7 sales E
2 6 sales C
1 4 sales B
5 5 market A
8 4 market D
6 3 market B
发布于 2020-03-06 17:54:48
尝试这样做,这是一种按降序进行groupby和排序的简单方法:
df.groupby(['companyName'])['overallRating'].sum().sort_values(ascending=False).head(20)
https://stackoverflow.com/questions/27842613
复制相似问题