如何按天提取时序频次数据中Top3/Bottom3的计数记录?
按天提取Count最大/最小的3条记录方案
核心实现思路
无需拆分日期和时间列,直接利用Pandas的groupby结合nlargest/nsmallest,或通过组内排名筛选,即可高效实现需求。
方法一:groupby + nlargest/nsmallest(最简洁)
先确保starttime为datetime类型,再按日期分组后提取每组的Top3:
# 转换starttime为datetime类型(若原数据为字符串格式) df['starttime'] = pd.to_datetime(df['starttime']) # 提取每天Count最大的3条记录 daily_top3 = df.groupby(df['starttime'].dt.date).apply( lambda group: group.nlargest(3, 'Count') ).reset_index(drop=True) # 若要提取最小的3条,替换nlargest为nsmallest daily_bottom3 = df.groupby(df['starttime'].dt.date).apply( lambda group: group.nsmallest(3, 'Count') ).reset_index(drop=True)
reset_index(drop=True)用于去除分组产生的多级索引,得到整洁的结果。
方法二:组内排名筛选(灵活处理并列场景)
如果需要处理Count并列的情况(比如多个小时Count相同,需按规则保留),可以用rank函数:
df['starttime'] = pd.to_datetime(df['starttime']) df['date'] = df['starttime'].dt.date # 计算每天内Count的降序排名,method='first'表示按出现顺序处理并列值 df['count_rank'] = df.groupby('date')['Count'].rank( ascending=False, method='first' ) # 筛选排名前3的记录,最后清理临时列 daily_top3 = df[df['count_rank'] <= 3].drop(columns=['date', 'count_rank']).reset_index(drop=True)
method参数可选min/max/dense等,比如method='min'会让并列值获得相同的最小排名,可能导致某天结果超过3条(若存在多个并列第3)。
你之前方案未成功的原因
拆分日期列本身没问题,但如果后续仅做了groupby('date').sort_values('Count')却未在组内提取前3行,或未正确保留原数据的starttime列,就会导致结果不符合预期。上面两种方法直接在分组后处理行筛选,可完整保留所需列。
内容的提问来源于stack exchange,提问作者Ritesh Mukhopadhyay
相关产品推荐
相关产品推荐

