Python 在整个数据帧中查找最不频繁的值

Python 在整个数据帧中查找最不频繁的值,python,pandas,numpy,scipy,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循环来计算数字,然后返回最小的计数

我的数据帧是这样的

>   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循环来计算数字,然后返回最小的计数数字,但它不是非常理想的。我搜索了一下是否还有其他方法,但没有找到

我只找到返回频率最高的数字

还有其他方法吗?

您可以堆叠并获取值\u计数:

value_按频率统计订单,因此您可以只取最后一个,尽管在本例中,许多订单只出现一次。69恰好是最后一个。

您可以叠加并获取值\u计数:

value_按频率统计订单,因此您可以只取最后一个,尽管在本例中,许多订单只出现一次。69恰好是最后一个。

使用pandas.DataFrame.apply with pandas.Series.value\u计数的另一种方法:

令我惊讶的是,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更出色。也许我的编码是错误的

使用pandas.DataFrame.apply和pandas.Series.value_计数的另一种方法:

令我惊讶的是,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更出色。也许我的编码是错误的

如果有多个值具有相同的频率会发生什么?如果有多个值具有相同的频率会发生什么?您正在按列应用,共有100列。为了更好地比较它们的扩展方式,请尝试使用df2=pd.DataFramenp.random.randint1、1000500、100000按列应用,共有100列。为了更好地比较它们的扩展方式,请尝试df2=pd.DataFramenp.random.randint1,100050010000thanks!这对我帮助很大。我不知道斯塔克的事。我会进一步调查的。再次感谢,谢谢!这对我帮助很大。我不知道斯塔克的事。我会进一步调查的。再次感谢。
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)