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

Pandas分组聚合:按日期筛选每日Top3热门列车线路

解决每日Top3热门线路筛选问题

嘿,恭喜你完成了前期的数据拼接和分组统计工作!已经走到这一步,离拿到想要的每日Top3结果就差临门一脚啦😉

首先,先把你现有的分组代码简化一下,直接给统计结果列起个清晰的名字(比如run_count),后续处理起来更直观:

# 分组统计每日各线路的运行次数,并命名统计列
df_grouped = df.groupby(['date', 'complete_route_name'])['start_time'].nunique().reset_index(name='run_count')

接下来给你两种实现筛选每日Top3的方案,你可以根据需求选择:

方案一:用nlargest快速取前3

这种方法简单直接,按日期分组后,对每个日期组取运行次数最多的前3条:

# 按日期分组,每组保留run_count最高的前3条线路
daily_top3 = df_grouped.groupby('date').apply(lambda x: x.nlargest(3, 'run_count')).reset_index(drop=True)

注:如果某一天有多个线路并列第3名,nlargest(3)会把所有并列的都保留下来(比如4条线路并列第3,结果条数会超过3)。如果想严格每天只返回3条,可以把nlargest(3)换成sort_values('run_count', ascending=False).head(3),但这样会截断并列的情况。

方案二:用rank精准控制排名逻辑

如果你想更灵活地处理并列排名的情况(比如让并列的线路共享同一个排名),可以用排名函数:

# 计算每个日期内各线路的运行次数排名(降序,相同次数取最小排名)
df_grouped['rank'] = df_grouped.groupby('date')['run_count'].rank(ascending=False, method='min')

# 筛选排名≤3的线路,然后去掉排名列
daily_top3 = df_grouped[df_grouped['rank'] <= 3].drop(columns='rank').reset_index(drop=True)

这里的method='min'表示相同运行次数的线路会取最小的排名(比如两个线路都是第2名,下一个线路是第3名);如果想用连续排名(两个第2名之后下一个是第4名),可以把method改成'dense'。

最后,你可以给结果按日期和运行次数降序排序,让输出更整齐:

daily_top3.sort_values(by=['date', 'run_count'], ascending=[True, False], inplace=True)

最终的输出格式会和你期望的一致,比如:

date complete_route_name run_count
2015-08-01 Attempt Pin to Roll Test 101
2015-08-01 Suit Treatment Turnback to Spiders Toothbrush 93
2015-08-01 Concourse Village to Port Morris 87
2015-08-02 ... ...

内容的提问来源于stack exchange,提问作者Edward Webster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:27:40