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

