众数简单来说就是一组数中出现次数最多的那个数( 不少于一个)。比如[1,2,3,2]的众数是2,[1,2,3,2,3]的众数是2,3。
首先假设一组数
[1,2,3,2,4,2,6,3]
方法一,利用np.bincount()
代码如下:
import numpy as np
list1 = [1, 3, 2, 4, 2, 6, 2]
list2 = [1, 3, 2, 4, 2, 6, 2, 3, 3]
counts1 = np.bincount(list1) # 返回值是索引从零递增,值是索引出现的次数,比如[3,0,2]代表0出现3次、1出现0次、2出现2次。
counts2 = np.bincount(list2)
'''众数只有一个的情况'''
Mode1 = np.argmax(counts1) # 2
'''众数一个或多个的情况'''
Mode2 = [i for i, j in enumerate(counts2) if j == max(counts2)] # [2,3]
方法二,利用scipy.stats.mode()
这个方法只能计算单个众数的情况。
代码如下:
from scipy import stats
list1 = [1, 3, 2, 4, 2, 6, 2]
list2 = [1, 3, 2, 4, 2, 6, 2, 3, 3]
'''众数只有一个的情况'''
Mode1 = stats.mode(list1)[0][0] # 2 其中stats.mode(list1)[0][0]是返回众数,stats.mode(list1)[1][0]是返回众数出现的次数。
'''众数多个的情况(只能返回最小的那个,会出错)'''
Mode2 = stats.mode(list1)[0][0] # 2 结果错误,是因为stats.mode(list)[0][0] 的返回值是出现次数做多的那个,相同次数有多个时只返回最小的那个数。
方法三,利用for循环求解
代码如下:
list1 = [1, 3, 2, 4, 2, 6, 2]
list2 = [1, 3, 2, 4, 2, 6, 2, 3, 3]
list11 = list(set(list1)) # 去除重复数后的列表
list22 = list(set(list2)) # 去除重复数后的列表
'''众数只有一个的情况'''
num = [] # 记录各个数出现的次数
for i in list11 :
num.append(list1 .count(i))
Mode1 = [list11[i] for i, j in enumerate(num) if j == max(num)]
'''众数一个或多个的情况'''
num = [] # 记录各个数出现的次数
for i in list22 :
num.append(list2.count(i))
Mode2 = [list22 [i] for i, j in enumerate(num) if j == max(num)]
欢迎指出错误^ _ ^