pandas按行计算多列众数时DataFrame出现多余列报错ValueError如何解决?
报错原因
pandas 中DataFrame.mode(axis=1)会返回每行的全部众数:如果某一行存在多个出现频次相等的最高频数值,就会为每个众数单独生成一列,缺失位置自动填充NaN。你遇到的报错是因为样本中至少有一行存在2个众数,导致mode返回了2列的DataFrame,无法直接赋值给单个新列。
解决方案
方案1:直接取每行第一个众数
无需额外逻辑的场景下,直接取mode返回结果的第一列即可,代码如下:finals_preds['ENSEMB'] = finals_preds[['ISOFOR','SVM-1C','KMEANS','LOCOUT']].mode(axis=1)[0]方案2:自定义多众数处理规则
如果需要明确指定多众数时的取值逻辑(比如取数值更小的、按算法优先级取),可以用apply自定义行处理函数,示例如下:def get_row_mode(row): count_res = row.value_counts() # 提取所有众数 all_modes = count_res[count_res == count_res.max()].index.tolist() # 示例逻辑:多众数时取数值最小的,可根据业务需求修改 return min(all_modes) finals_preds['ENSEMB'] = finals_preds[['ISOFOR','SVM-1C','KMEANS','LOCOUT']].apply(get_row_mode, axis=1)方案3:多众数场景特殊标记
如果多众数属于需要排查的异常情况,可以给这类行填充自定义标记,方便后续处理:mode_res = finals_preds[['ISOFOR','SVM-1C','KMEANS','LOCOUT']].mode(axis=1) # 单众数取众数值,多众数填充标记999 finals_preds['ENSEMB'] = mode_res[0].where(mode_res.shape[1] == 1, 999)
内容的提问来源于stack exchange,提问作者Shane Li
相关产品推荐
相关产品推荐

