【问题标题】:Pandas groupby year filtering the dataframe by n largest valuesPandas groupby year 按 n 个最大值过滤数据框
【发布时间】:2019-12-12 03:12:23
【问题描述】:
我有一个每小时级别的数据框,其中包含几列。我想在我的数据框中每年提取特定列的 10 个最高值的整行(包含所有列)。
到目前为止,我运行了以下代码:
df = df.groupby([df.index.year])['totaldemand'].apply(lambda grp: grp.nlargest(10)))
这里的问题是,我只获得该特定列每年的前 10 个值,而我丢失了其他列。如何执行此操作并让其他列的相应值对应于我的“总需求”列每年的前 10 个值?
【问题讨论】:
标签:
pandas
filtering
pandas-groupby
【解决方案1】:
我们通常在sort_values之后做head
df = df.sort_values('totaldemand',ascending = False).groupby([df.index.year])['totaldemand'].head(10)
【解决方案2】:
nlargest 可以应用于每个组,通过列来查找
最大值。
所以运行:
df.groupby([df.index.year]).apply(lambda grp: grp.nlargest(3, 'totaldemand'))
当然,在最终版本中将 3 替换为您的实际值。
【解决方案3】:
获取查询的索引并将其用作原始df 的掩码:
idx = df.groupby([df.index.year])['totaldemand'].apply(lambda grp: grp.nlargest(10))).index.to_list()
df.iloc[idx,]
(或类似的东西,没有任何测试数据我现在无法测试)