Groupby 3列,每组最少保留5列

时间:2019-10-19 10:37:59

标签: python pandas

首先,对不起,我不是英国人,但我希望您仍然能理解我的问题;-)

我有一个列表,其中包含与我合作的有线网络提供商的数据。

我将这些信息按

分组
traffic.groupby(["HUB","FIBER_NODES","WEEK"])

这很好,我正在获取每个HUB-NODES-WEEK组的所有信息。 但是现在我要检查流量的发展情况。为此,我想获得此数据框中前5周和后5周的平均值之间的差。

为此,我不想将日历周保持在1到38之间。我只想保持1到5或34到38。

我尝试过:

traffic.groupby(["HUB","FIBER_NODES","WEEK"]).nlargest(5)

错误: AttributeError:无法访问“ DataFrameGroupBy”对象的可调用属性“ nlargest”,请尝试使用“ apply”方法

下次尝试:

traffic.groupby(["HUB","FIBER_NODES","WEEK"]).apply(lambda grp: grp.nlargest(5,"WEEK"))

这没有用,我仍然从1到38整整一周。

有人知道我接下来可以尝试什么吗? ;-)

非常感谢您

马可

2 个答案:

答案 0 :(得分:1)

我认为评论中的@ jon-clements有正确的主意。问题在于您在分组依据中包括了"WEEK"。删除它对我有用(在不同数据上):

traffic.groupby(["HUB","FIBER_NODES"]).apply(lambda grp: grp.nlargest(5,"WEEK"))

(我也希望nlargest可以工作,但显然尚未为DataFrame groupbys实现它。:-/)

答案 1 :(得分:0)

谢谢您的回答。

我找到了一个效果很好的解决方案:

start_df = traffic.loc[(traffic["WEEK"] < min_week) & (traffic["STREAM_TYPE"] == str_type)].groupby(["HUB","FIBER_NODES"]).median()[["AVG_ACTIVE_CMS","AvgVal"]].reset_index()

祝您在新的一周里有个好的开始。 马可