我正在使用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”,我的代码都会引发错误,但是感觉好像我遗漏了一些明显的东西。
答案 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。