在整个数据框中找到最不频繁的值

时间:2020-09-16 09:35:53

标签: python pandas numpy scipy

我的数据框是这样的

>   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返回最频繁的号码。

还有其他方法吗?

2 个答案:

答案 0 :(得分:4)

您可以stack并拿走value_counts

df.stack().value_counts().index[-1]
# 69

value_counts按频率排序,因此您可以选择最后一个,尽管在此示例中,许多仅出现一次。 69恰好是最后一个。

答案 1 :(得分:1)

pandas.DataFrame.applypandas.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(也许我的编码在;()上是错误的。