我的数据框是这样的
> 93 40 73 41 115 74 59 98 76 109 43 44
105 119 56 62 69 51 50 104 91 78 77 75
119 61 106 105 102 75 43 51 60 114 91 83
它具有8000行和12列
我想在整个数据框中找到最不频繁的值(不仅在列中)。
我尝试将此数据帧转换为numpy数组,并使用for
循环对数字进行计数,然后返回最小的计数数字,但它不是非常理想。我搜索了其他方法,但找不到。
我只发现scipy.stats.mode返回最频繁的号码。
还有其他方法吗?
答案 0 :(得分:4)
您可以stack
并拿走value_counts
:
df.stack().value_counts().index[-1]
# 69
value_counts
按频率排序,因此您可以选择最后一个,尽管在此示例中,许多仅出现一次。 69
恰好是最后一个。
答案 1 :(得分:1)
将pandas.DataFrame.apply
与pandas.Series.value_counts
结合使用的另一种方法:
df.apply(pd.Series.value_counts).sum(1).idxmin()
# 40
# There are many values with same frequencies.
令我惊讶的是,apply
方法似乎是我尝试过的方法中最快的(原因是我要发布的原因):
df2 = pd.DataFrame(np.random.randint(1, 1000, (500000, 100)))
%timeit df2.apply(pd.Series.value_counts).sum(1).idxmin()
# 2.36 s ± 193 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit df2.stack().value_counts().index[-1]
# 3.02 s ± 86.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
uniq, cnt = np.unique(df2, return_counts=True)
uniq[np.argmin(cnt)]
# 2.77 s ± 111 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
与我对apply
的理解非常慢相反,它甚至胜过numpy.unique
(也许我的编码在;()上是错误的。