熊猫新手,所以我可能在这里缺少明显的东西。我的目的是按照工作类型按类别列出最重要的项目。这是我正在使用的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
也就是说,所有功能,然后是错误,然后是升级(不需要以相同的顺序进行,但至少按正确的分组)。
我缺少明显的东西吗?预先感谢您的答复!
答案 0 :(得分:1)
更新:
根据sort
的第一个effort
。 groupby
type
,先乘head
,然后再乘sort
乘type
。
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
更为简洁)
更新:您可以按类型(升序)和工作量(降序)+ groupby
和head
进行预排序:
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()
这样的函数会更有用。