python 组内排序_python - pandas groupby在组内排序

python - pandas groupby在组内排序

我想将数据框分组为两列,然后对组内的聚合结果进行排序。

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

4个解决方案

105 votes

你想要做的实际上是groupby(在第一个groupby的结果上):sort并取每组的前三个元素。

从第一个groupby的结果开始:

In [60]: df_agg = df.groupby(['job','source']).agg({'count':sum})

我们按索引的第一级分组:

In [63]: g = df_agg['count'].groupby(level=0, group_keys=False)

然后我们想对每个组进行排序('order')并获取前三个元素:

In [64]: res = g.apply(lambda x: x.order(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

joris answered 2019-07-15T22:10:04Z

102 votes

您也可以一次性完成,首先进行排序,然后使用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

tvashtar answered 2019-07-15T22:10:28Z

13 votes

这是在排序顺序上排名前3的其他示例,以及在组内排序:

In [43]: import pandas as pd

In [44]: df = pd.DataFrame({"name":["Foo", "Foo", "Baar", "Foo", "Baar", "Foo", "Baar", "Baar"], "count_1":[5,10,12,15,20,25,30,35], "count_2" :[100,150,100,25,250,300,400,500]})

In [45]: df

Out[45]:

count_1 count_2 name

0 5 100 Foo

1 10 150 Foo

2 12 100 Baar

3 15 25 Foo

4 20 250 Baar

5 25 300 Foo

6 30 400 Baar

7 35 500 Baar

### Top 3 on sorted order:

In [46]: df.groupby(["name"])["count_1"].nlargest(3)

Out[46]:

name

Baar 7 35

6 30

4 20

Foo 5 25

3 15

1 10

dtype: int64

### Sorting within groups based on column "count_1":

In [48]: df.groupby(["name"]).apply(lambda x: x.sort_values(["count_1"], ascending = False)).reset_index(drop=True)

Out[48]:

count_1 count_2 name

0 35 500 Baar

1 30 400 Baar

2 20 250 Baar

3 12 100 Baar

4 25 300 Foo

5 15 25 Foo

6 10 150 Foo

7 5 100 Foo

Surya answered 2019-07-15T22:10:52Z

5 votes

如果您不需要对列进行求和,请使用@ tvashtar的答案。 如果你确实需要求和,那么你可以使用@joris的答案或者这个与它非常相似的答案。

df.groupby(['job']).apply(lambda x: (x.groupby('source')

.sum()

.sort_values('count', ascending=False))

.head(3))

Ted Petrou answered 2019-07-15T22:11:16Z

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值