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

如何在计算数据集众数时忽略nan值?

解决多模态函数中忽略NaN值的问题

要解决NaN被误判为众数的问题,核心是在计算众数前先过滤掉所有NaN相关的值,基于非空数据进行统计。以下是修改后的代码及关键说明:

import pandas as pd
# 示例数据(将字符串'nan'替换为标准缺失值pd.NA,更贴合实际场景)
df = {'A': pd.NA,'B': pd.NA,'C':'Blue', 'D': pd.NA,'E':'Blue', 'Index':[0]}
df = pd.DataFrame(df).set_index('Index')

def find_mode(x):
    # 第一步:过滤所有缺失值(含pd.NA、np.nan和字符串'nan')
    filtered_x = [val for val in x if pd.notna(val) and val != 'nan']
    
    # 处理过滤后的边界情况
    if len(filtered_x) == 0:
        return 'NA'
    elif len(filtered_x) == 1:
        return [filtered_x[0]]
    
    # 统计非空值的出现次数
    d = {}
    for value in filtered_x:
        if value not in d:
            d[value] = 1
        else:
            d[value] += 1

    if len(d) == 1:
        return [list(d.keys())[0]]
    else:
        # 获取最高出现次数
        max_count = max(d.values())
        
        # 收集所有达到最高次数的候选众数
        modes = [(val, cnt) for val, cnt in d.items() if cnt == max_count]
        counter = sum(cnt for _, cnt in modes)

        # 判断是否存在多个有效众数
        if counter != len(filtered_x):
            return [mode[0] for mode in modes]
        else:
            return 'NA'

mode = []
for x in df.itertuples(index=True):
    # itertuples会返回索引作为第一个元素,取x[1:]只保留数据列
    m = find_mode(x[1:])
    mode.append(m)

print(mode)  # 输出:[['Blue']]

关键修改点:

  • 过滤缺失值:在函数开头通过列表推导式生成filtered_x,直接排除所有无效的NaN类值,确保后续统计仅针对有效数据。
  • 边界情况处理:新增过滤后无数据、只剩单个数据的分支,避免逻辑报错。
  • 统计基准调整:所有统计逻辑(如长度判断、次数求和)均基于过滤后的列表,彻底排除NaN的干扰。
  • 修正数据传入:调用find_mode时传入x[1:],剔除itertuples返回的索引值,避免无关数据影响结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:15:41