Python statistics求众数遇多值报错、multimode无法识别问题
问题根因
statistics.mode()从设计上仅支持返回唯一众数,当数据集存在多个频次并列最高的值时,会直接抛出StatisticsError: no unique mode; found X equally common values,属于函数预期行为,和数据规模无关。statistics.multimode()无法被识别的原因是:该方法是Python 3.8及以上版本才内置到statistics标准库的,运行环境的Python版本低于3.8时,解释器找不到该方法定义,就会触发名称类报错。
实现方案
方案1:使用pandas原生接口(推荐,适配你当前的数据流,无版本依赖、性能适合大规模数据)
你当前处理的是pandas的Series对象,不需要依赖statistics模块,直接用pandas内置的频次统计方法即可一次性拿到所有众数:
import pandas as pd df = pd.read_csv('Area(1).txt', delimiter='\t') df4 = df.iloc[0:528, 5] # 统计列内每个值的出现频次 value_counts = df4.value_counts() # 提取最高频次值 max_count = value_counts.max() # 筛选所有频次等于最高值的结果,即为全部众数 multi_modes = value_counts[value_counts == max_count].index.tolist() print(multi_modes)
方案2:升级Python版本后调用官方multimode
如果要使用statistics内置的多众数方法,将本地Python环境升级到3.8或更高版本后,可直接按如下方式调用:
import pandas as pd import statistics df=pd.read_csv('Area(1).txt',delimiter='\t') df4=df.iloc[0:528,5] multi_modes = statistics.multimode(df4) print(multi_modes)
方案3:低版本Python手动实现多众数逻辑
如果暂时无法升级Python版本,可以借助collections模块的计数能力手动实现等价逻辑,效果和官方multimode完全一致:
import pandas as pd from collections import Counter df=pd.read_csv('Area(1).txt',delimiter='\t') df4=df.iloc[0:528,5] count_map = Counter(df4.tolist()) max_freq = max(count_map.values()) multi_modes = [val for val, freq in count_map.items() if freq == max_freq] print(multi_modes)
内容的提问来源于stack exchange,提问作者Kurapika
相关产品推荐
相关产品推荐

