可以将不直接参与计算的列包含在groupby语句中吗?

时间:2019-04-16 14:40:33

标签: python pandas pandas-groupby

我正在使用Fivethirtyeight中的central_grads练习数据,并且试图查看每个专业类别('Major_category')中哪个专业('Major')拥有最多的学生('Total')。

这是一个示例数据框:

Major              Major Category    Total
Nuclear Eng        Engineering       4350
Marketing          Business          10035

我希望得到如下输出:

recent_grads.groupby('Major_category')['Total'].agg('max')

...仅返回每个专业类别中总计最高的专业。

我使用了groupby语句,该语句返回每个主要类别中最多的学生,如下所示:

do.call(pmax,c(df[grep("eta",names(df))],na.rm=TRUE))
#[1]  1  1  2 NA

按预期,这将返回每个人口中最大的学生人数。我不知道在上面的代码中何处插入“ Major”变量,因此我的输出不仅告诉我每个专业类别中最大的学生人数是多少,还知道它属于哪个专业。无论我在哪里放置“ Major”,我的代码都会引发错误,但是感觉好像我遗漏了一些明显的东西。

4 个答案:

答案 0 :(得分:2)

尝试sort_values + drop_duplicates

recent_grads.sort_values(['Total']).drop_duplicates('Major_category',keep='last')

transform

s=recent_grads.groupby(['Major_category'])['Total'].transform('max')
recent_grads[recent_grads.Total==s]

idxmax

s=recent_grads.groupby(['Major_category'])['Total'].idxmax()
recent_grads.iloc[s]

答案 1 :(得分:0)

您可以按多列分组:

recent_grads.groupby(['Major', 'Major_category'])['Total'].agg('max')

答案 2 :(得分:0)

这能完成您想要的吗?

recent_grads.groupby(['Major_category'])[["Major", "Total"]].max()

答案 3 :(得分:0)

我认为以下是做到这一点的“惯用熊猫”方式

In [11]: df = pd.DataFrame({"Major": ["Petroleum Eng", "Nuclear Eng", "Marketing", "Accounting"],  
    ...:                 "Major Category": ["Engineering", "Engineering", "Business", "Business"], 
    ...:                 "Total": [1001, 4350, 10035, 3051] })                                                                                                                           

In [12]: df.groupby("Major Category").apply(lambda x: x.sort_values("Total").iloc[0,:])                                                                                                  
Out[12]: 
                        Major Major Category  Total
Major Category                                     
Business           Accounting       Business   3051
Engineering     Petroleum Eng    Engineering   1001

In [13]: df.groupby("Major Category").apply(lambda x: x.sort_values("Total", ascending=False).iloc[0,:])                                                                                 
Out[13]: 
                      Major Major Category  Total
Major Category                                   
Business          Marketing       Business  10035
Engineering     Nuclear Eng    Engineering   4350

如果您有更大的数据集,请尝试分析运行这些配方所需的时间。

对我来说,唯一有意义的大熊猫性能指标是配方或摘要如何随行数缩放。 %timeit对于小型数据集并不能证明有效的IMO。