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

Python分组聚合计算第二众数(Mode2)遇索引越界问题求助

分组聚合中计算第二众数的索引越界问题解决

问题描述

在对fact_price_pt按['COD_BANDERA', 'des_product', 'dat_price']分组聚合时,计算第一众数(Mode1)正常,但尝试计算第二众数(Mode2)时触发如下错误:

IndexError: index 1 is out of bounds for axis 0 with size 1

原聚合代码:

grouped_df_multiple = fact_price_pt.groupby(['COD_BANDERA', 'des_product', 'dat_price'], as_index = False).agg({
'calc_pvp': ['mean', 'min', 'max', lambda x: x.mode().iloc[0] ,lambda x: x.mode().iloc[0]],
'DES_BANDERA': ['max']})

尝试的两种第二众数写法均报错:

  • lambda x: x.mode().iloc[1]
  • lambda x: x.value_counts(ascending=True).index[1]

问题根源

部分分组的calc_pvp列只有一个唯一值,或所有值出现频率相同且仅存在一个众数,导致x.mode()或x.value_counts()返回的结果长度为1,访问索引1时触发越界。

可行解决方案

通过自定义函数处理边界情况,给无第二众数的分组返回默认值(如pd.NA):

方案1:基于mode()的安全第二众数函数

import pandas as pd

def get_second_mode(x):
    modes = x.mode()
    return modes.iloc[1] if len(modes) >= 2 else pd.NA

方案2:基于value_counts()的安全第二众数函数

import pandas as pd

def get_second_mode(x):
    counts = x.value_counts()
    return counts.index[1] if len(counts) >= 2 else pd.NA

修改后的聚合代码

将原lambda替换为自定义函数,同时可重命名列避免多级索引混乱:

grouped_df_multiple = fact_price_pt.groupby(['COD_BANDERA', 'des_product', 'dat_price'], as_index=False).agg({
    'calc_pvp': ['mean', 'min', 'max', lambda x: x.mode().iloc[0], get_second_mode],
    'DES_BANDERA': ['max']
})

# 重命名列
grouped_df_multiple.columns = [
    'COD_BANDERA', 'des_product', 'dat_price',
    'calc_pvp_mean', 'calc_pvp_min', 'calc_pvp_max',
    'calc_pvp_mode1', 'calc_pvp_mode2', 'DES_BANDERA_max'
]

进阶优化(区分并列众数)

若需排除“第一、第二众数频率相同”的情况,可在函数中增加判断:

def get_second_mode(x):
    counts = x.value_counts()
    if len(counts) < 2:
        return pd.NA
    # 第一和第二频率相同时,视为无唯一第二众数
    if counts.iloc[0] == counts.iloc[1]:
        return pd.NA
    return counts.index[1]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:42:33