groupby中出现意外分组

2024-04-24 16:09:07 发布

您现在位置:Python中文网/ 问答频道 /正文

对熊猫来说很陌生,所以我在这里可能遗漏了一些明显的东西。我的意图是简单地按工作列出顶级项目,按类型分组。这里是我正在使用的CSV作为输入:


project,effort,type
p1,6,feature
p2,4.5,feature
p3,4.375,bug
p4,4,bug
p5,3.875,bug
p6,3.5,upgrade
p7,3.5,feature
p8,3,upgrade
p9,2,upgrade

现在,我的意图是显示前3个项目的努力,按类型分组。我就是这么做的:

dev=pd.read_csv('test.csv')
dev.sort_values(['effort'], ascending=False).groupby('type').head(3)

这就是我在ipython看到的:

  project  effort     type
0      p1   6.000  feature
1      p2   4.500  feature
2      p3   4.375      bug
3      p4   4.000      bug
4      p5   3.875      bug
5      p6   3.500  upgrade
6      p7   3.500  feature
7      p8   3.000  upgrade
8      p9   2.000  upgrade

虽然这些行看起来很准确,但我希望输出的特性、bug和升级都被分组在一起,即使这意味着这些工作没有严格按照降序排序,比如:

期望值:

  project  effort     type
0      p1   6.000  feature
1      p2   4.500  feature
6      p7   3.500  feature
2      p3   4.375      bug
3      p4   4.000      bug
4      p5   3.875      bug
5      p6   3.500  upgrade
7      p8   3.000  upgrade
8      p9   2.000  upgrade

也就是说,所有的特性,然后是bug,然后是升级(不需要按相同的顺序,但至少按正确的顺序分组)。你知道吗

我是不是漏掉了什么明显的东西?提前感谢您的回复!你知道吗


Tags: projecttypebugupgradefeaturep2p3p5
3条回答

在提供的示例数据集中,每个项目都是具有特定类型的单个记录。在这种情况下,我们可以通过nlargestgroupby类型和sum努力获得前3个项目:

df.nlargest(3, 'effort').groupby('type').sum()

输出:

         effort
type           
bug       4.375
feature  10.500

顺便说一句,我来解释一下你的问题

dev.sort_values(['effort'], ascending=False).groupby('type').head(3)

当您在GroupBy对象上使用head时,它会为每个组获取第一个元素(参见文档中的^{}),因此“feature”、“bug”和“upgrade”中的每一个元素都会排在前3位。如果在groupby之前应用head,它将正常工作:

dev.sort_values(['effort'], ascending=False).head(3).groupby('type').sum()

它基本上与我上面的解决方案相同,唯一的区别是我使用了nlargest,而不是在后面排序和应用headnlargest更简洁)

更新:您可以按类型(升序)和工作量(降序)+groupbyhead预先排序:

df.sort_values(['type', 'effort'], ascending=[1,0]).groupby('type').head(3)

输出:

  project  effort     type
2      p3   4.375      bug
3      p4   4.000      bug
4      p5   3.875      bug
0      p1   6.000  feature
1      p2   4.500  feature
6      p7   3.500  feature
5      p6   3.500  upgrade
7      p8   3.000  upgrade
8      p9   2.000  upgrade

显然,在pandas讨论的^{}中有一个公开的问题

更新:

首先sort根据effortgroupbytype中,服用head,然后再次服用sorttype。你知道吗

df.sort_values('effort', ascending=False).groupby(['type']).head(3).sort_values('type')

head(3)至少是每个组的大小,因此打印整个DataFrame。你知道吗

import pandas as pd
import csv
from pandas.compat import StringIO

print(pd.__version__)

csvdata = StringIO("""project,effort,type
p1,6,feature
p2,4.5,feature
p3,4.375,bug
p4,4,bug
p5,3.875,bug
p6,3.5,upgrade
p7,3.5,feature
p8,3,upgrade
p9,2,upgrade""")

df = pd.read_csv(csvdata, sep=",")

print(df)
print(df.sort_values(['effort'], ascending=False).groupby('type').head(1))

产生

0.24.2
  project  effort     type
0      p1   6.000  feature
1      p2   4.500  feature
2      p3   4.375      bug
3      p4   4.000      bug
4      p5   3.875      bug
5      p6   3.500  upgrade
6      p7   3.500  feature
7      p8   3.000  upgrade
8      p9   2.000  upgrade
  project  effort     type
0      p1   6.000  feature
2      p3   4.375      bug
5      p6   3.500  upgrade

但是MCVE代码只显示了Grouper的用法。像mean()这样的函数会更有用。你知道吗

相关问题 更多 >