首页 > 解决方案 > 每天只选择系列中的第 n 个最大值

问题描述

我有一些噪音调查数据告诉我在几天内测量的噪音水平。我想找到每个夜间时段的第 5 高噪音水平。我把它做成了 Pandas 系列,并使用 groupby 和 nlargest 方法向我展示了每晚的 5 个最高噪音水平,但现在我只想查看每个时段的第 5 个最高值(即 82、86、86、87 等。 )。实现这一目标的最佳方法是什么?

night_time_lmax.groupby(by=night_time_lmax.index.date).nlargest(5)
            Start date & time  
2021-08-18  2021-08-18 23:00:00     82.0
            2021-08-18 23:15:00     82.0
            2021-08-18 23:30:00     82.0
            2021-08-18 23:45:00     82.0
2021-08-19  2021-08-19 05:45:00    100.0
            2021-08-19 01:15:00     91.0
            2021-08-19 04:45:00     87.0
            2021-08-19 06:15:00     87.0
            2021-08-19 01:45:00     86.0
2021-08-20  2021-08-20 06:30:00     90.0
            2021-08-20 06:00:00     88.0
            2021-08-20 03:15:00     87.0
            2021-08-20 05:30:00     87.0
            2021-08-20 01:15:00     86.0
2021-08-21  2021-08-21 01:30:00     98.0
            2021-08-21 03:00:00     93.0
            2021-08-21 00:45:00     88.0
            2021-08-21 06:00:00     88.0
            2021-08-21 03:30:00     87.0
2021-08-22  2021-08-22 23:45:00    102.0
            2021-08-22 00:30:00     96.0
            2021-08-22 06:30:00     92.0
            2021-08-22 05:00:00     91.0
            2021-08-22 01:30:00     90.0
2021-08-23  2021-08-23 01:15:00     98.0
            2021-08-23 02:15:00     88.0
            2021-08-23 00:45:00     87.0
            2021-08-23 03:00:00     86.0
            2021-08-23 06:00:00     86.0
2021-08-24  2021-08-24 01:00:00     93.0
            2021-08-24 00:30:00     89.0
            2021-08-24 06:30:00     87.0
            2021-08-24 02:45:00     86.0
            2021-08-24 06:00:00     86.0```

标签: pythonpandasseries

解决方案


我在这里看到两个选项。

要么按您的值对数据进行排序,然后nth按组获取元素:

(night_time_lmax.sort_values(by='value_column', ascending=False)
                .groupby(by=night_time_lmax.index.date).nth(5)
)

## below gives the same result for shorter syntax:
# (night_time_lmax.sort_values(by='value_column')
#                 .groupby(by=night_time_lmax.index.date).nth(-5)
# )

或者使用 double groupby,一次用于前 5 名,一次用于最后一名:

(night_time_lmax.groupby(by=night_time_lmax.index.date).nlargest(5)
                .groupby(by=night_time_lmax.index.date).last()
)

推荐阅读