熊猫Groupby中的意外分组

时间:2019-05-02 11:47:55

标签: python pandas

熊猫新手,所以我可能在这里缺少明显的东西。我的目的是按照工作类型按类别列出最重要的项目。这是我正在使用的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

尽管行看起来很准确,但我希望输出将功能,错误和升级分组在一起,即使这意味着工作没有严格按照降序排列,如下所示:

预期:

  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

也就是说,所有功能,然后是错误,然后是升级(不需要以相同的顺序进行,但至少按正确的分组)。

我缺少明显的东西吗?预先感谢您的答复!

3 个答案:

答案 0 :(得分:1)

更新

根据sort的第一个effortgroupby type,先乘head,然后再乘sorttype

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

答案 1 :(得分:1)

在提供的样本数据集中,每个项目都是具有特定类型的单个记录。在这种情况下,我们可以先进行nlargest的努力,然后再进行groupby的类型和sum的努力,获得前3个项目:

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

输出:

         effort
type           
bug       4.375
feature  10.500

P.S。这里是要解释一下出了什么问题

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

当您在head对象上使用GroupBy时,它将获得每个组的第一个元素(请参阅head的文档),因此,每个“功能”都排在前3位','bug'和'upgrade'。如果您在head之前应用groupby,它将可以正常工作:

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

与上面的解决方案基本相同,唯一的不同是我后来使用nlargest而不是对head进行排序和应用(nlargest更为简洁)

更新:您可以按类型(升序)和工作量(降序)+ 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中讨论的here

中存在一个未解决的问题

答案 2 :(得分:0)

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()这样的函数会更有用。