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

如何为DataFrameGroupBy对象的每组选取首个最频繁的trip_id?

解决DataFrame分组后提取每组最频繁出现的首个trip_id问题

需求明确:按route_id和direction_id的组合分组,每组提取出现频率最高的trip_id;若多个trip_id频率相同,取首次出现的那个。

以下是两种直接可行的解决方案:

方法1:用mode()提取首个众数

pandas的Series.mode()会返回组内的所有众数,当存在多个众数时,默认按元素出现顺序排列。我们只需取第一个众数即可:

import pandas as pd

data = [
    [1000, 1, 1], [1000, 1, 1], [1000, 1, 1], [1000, 1, 2], [1000, 1, 2],
    [1000, 1, 2], [2000, 0, 1], [2000, 0, 1], [2000, 1, 2],
    [2000, 0, 2], [2000, 1, 2]]
df = pd.DataFrame(data, columns=['route_id', 'direction_id', 'trip_id'])

# 分组聚合,取首个众数
result = df.groupby(['route_id', 'direction_id'])['trip_id'].agg(lambda x: x.mode().iloc[0]).reset_index()
print(result)

输出结果完全符合预期:

route_id  direction_id  trip_id
0      1000             1        1
1      2000             0        1
2      2000             1        2

方法2:用value_counts()取频率最高的首个值

value_counts()默认按频率从高到低排序,频率相同时按值的升序排列;如果要严格遵循元素在组内的首次出现顺序,可添加sort=False参数。取排序后的第一个元素即可:

# 基础版本(频率相同按值升序)
result = df.groupby(['route_id', 'direction_id'])['trip_id'].agg(lambda x: x.value_counts().index[0]).reset_index()

# 严格按首次出现顺序选择频率相同的元素
result = df.groupby(['route_id', 'direction_id'])['trip_id'].agg(lambda x: x.value_counts(sort=False).index[0]).reset_index()

两种方法都能得到目标结果,可根据实际需求选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:05:14