Pandas按年份分组按n个最大值过滤数据框

时间:2019-12-11 18:50:27

标签: pandas filtering pandas-groupby

我有一个每小时几列的数据框。我想提取我数据框中每年特定列的10个上限值的整个行(包含所有列)。

到目前为止,我运行了以下代码:

df = df.groupby([df.index.year])['totaldemand'].apply(lambda grp: grp.nlargest(10)))

这里的问题是,我只获得该特定列每年的前10个值,而丢失其他列。如何进行此操作并使其他列的对应值与“ totaldemand”列中每年的前10个值相对应?

3 个答案:

答案 0 :(得分:1)

我们通常在head之后做sort_values

df = df.sort_values('totaldemand',ascending = False).groupby([df.index.year])['totaldemand'].head(10)

答案 1 :(得分:0)

获取查询索引并将其用作原始df上的掩码:

idx = df.groupby([df.index.year])['totaldemand'].apply(lambda grp: grp.nlargest(10))).index.to_list()
df.iloc[idx,]

(或扩展的内容,我现在无法在没有任何测试数据的情况下进行测试)

答案 2 :(得分:0)

最大可以应用于每个组,将列传递以查找 最大值。

所以运行:

df.groupby([df.index.year]).apply(lambda grp: grp.nlargest(3, 'totaldemand'))

当然,在最终版本中,将 3 替换为您的实际值。