Python Pandas:如何获取groupby分组内Message最大值对应的Hour?
获取每个月份中消息数量最多的小时(Pandas实现)
嘿,我来帮你搞定这个需求!基于你给出的聚合后数据结构,我用Pandas给你写两种常见场景的实现代码,应该能完美匹配你的需求。
场景1:数据按「月份+小时」分组,统计该时段的消息总数
假设你的DataFrame(命名为df)结构是这样的(这里把数量列改名为msg_count方便理解,你可以换成实际列名):
| Month | Hour | msg_count |
|---|---|---|
| 0 | 10 | 192 |
| 0 | 12 | 152 |
| 1 | 18 | 886 |
| 1 | 1 | 25 |
要获取每个月份中消息数最多的小时,直接按Month分组,提取每组中数量最大的行即可:
import pandas as pd # 核心代码:找到每个月份中数量最大的行 result = df.loc[df.groupby('Month')['msg_count'].idxmax()] # 只保留Month和Hour列(可选) result = result[['Month', 'Hour']].reset_index(drop=True) # 输出结果 print(result)
场景2:数据按「消息类型+月份」分组,统计该类型在当月的数量
如果你的示例里Hour列其实是消息数量(可能列名标注有误),DataFrame结构如下:
| Message | Month | Hour(实际为数量) |
|---|---|---|
| 1 | 0 | 192 |
| 1 | 1 | 152 |
| 1 | 18 | 886 |
| 2 | 0 | 49 |
而你需要的是每个月份中,所有消息类型的总数量最大对应的小时,可以先按月份+小时分组求和,再找最大值:
# 第一步:按Month和Hour分组,统计当月该小时的总消息数 hourly_total = df.groupby(['Month', 'Hour'])['Message'].sum().reset_index() # 第二步:找到每个月份中总数量最大的Hour result = hourly_total.loc[hourly_total.groupby('Month')['Message'].idxmax()] # 筛选需要的列 result = result[['Month', 'Hour']] print(result)
补充:处理并列最大值的情况
如果某个月份里有多个小时的消息数量并列第一,上面的idxmax()只会返回第一个出现的行。若需要保留所有并列的行,可以用transform方法:
# 获取每个月份的最大消息数 max_counts = hourly_total.groupby('Month')['Message'].transform('max') # 筛选出所有等于当月最大数的行 result = hourly_total[hourly_total['Message'] == max_counts]
这样就能完美解决你的问题啦!
内容的提问来源于stack exchange,提问作者user3595632
相关产品推荐
相关产品推荐

