You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按天提取时序频次数据中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 03:40:22