如何为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
相关产品推荐
相关产品推荐

