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

Pandas GroupBy求Mode:如何处理品牌出现次数平局的情况

处理众数平局场景的实用方案

针对你代码中客户B的pre-paid产品品牌出现次数平局的情况,可通过以下几种方式处理:

1. 自定义聚合函数,按规则返回结果

如果需要在平局时返回统一的标识或默认值,可编写自定义聚合函数:

def handle_mode_tie(s):
    count_stats = s.value_counts()
    max_freq = count_stats.max()
    mode_candidates = count_stats[count_stats == max_freq].index.tolist()
    # 规则:无平局返回唯一众数,平局返回None或自定义标识
    return mode_candidates[0] if len(mode_candidates) == 1 else None

sumary = data.groupby(['clientId', 'product'], observed=True).agg({'brand': handle_mode_tie})
sumary = sumary.unstack()

2. 统一返回列表格式,保留所有众数

如果需要保留所有平局的候选众数,确保结果格式一致(无论是否平局都返回列表):

def get_mode_list(s):
    count_stats = s.value_counts()
    max_freq = count_stats.max()
    return count_stats[count_stats == max_freq].index.tolist()

sumary = data.groupby(['clientId', 'product'], observed=True).agg({'brand': get_mode_list})
sumary = sumary.unstack()

这种方式避免了单个值和列表混合导致的数据类型混乱问题。

3. 结合业务规则指定优先级

如果业务上有明确的优先级(比如优先选取confirmed状态的品牌),可先按优先级排序再聚合:

# 按状态优先级排序:confirmed > pending > canceled
data_sorted = data.sort_values('status', key=lambda x: x.map({'confirmed': 0, 'pending': 1, 'canceled': 2}))
sumary = data_sorted.groupby(['clientId', 'product'], observed=True).agg({'brand': pd.Series.mode})
sumary = sumary.unstack()

此时客户B的pre-paid产品会优先取confirmed状态的brand_3作为结果。

4. 先统计次数再显式处理平局

先统计各分组内品牌的出现次数,再根据次数判断是否平局:

# 统计每个(clientId, product, brand)组合的出现次数
brand_counts = data.groupby(['clientId', 'product', 'brand'], observed=True).size().unstack(fill_value=0)
# 获取每个分组的最高出现次数
max_counts = brand_counts.max(axis=1)
# 生成结果:唯一众数取品牌名,平局返回指定标识
sumary = brand_counts.apply(
    lambda row: row[row == row.max()].index[0] if (row == row.max()).sum() == 1 else '平局',
    axis=1
).unstack()

内容的提问来源于stack exchange,提问作者FábioRB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:32:35