如何连续获得最多和第二个频繁值?

时间:2016-05-24 03:53:33

标签: python pandas dataframe

让我说我有一个包含100万行和30列的数据帧。 我想在数据框中添加一列,其值为“前30列的最常值”。我还想添加“前30列的第二个最常见的值”

我知道你可以为“前30列的最常值”做df.mode(axis = 1),但速度很慢。

无论如何要对它进行矢量化以便它可以快速进行吗?

1 个答案:

答案 0 :(得分:0)

df.mode(axis=1)已经过矢量化。但是,您可能想要考虑它是如何工作的。它需要独立地在每一行上运行,这意味着您将受益于"行主要订单"在NumPy中称为C顺序。 Pandas DataFrame始终是列主要顺序,这意味着获取30个值来计算一行的模式需要触摸30页内存,这是无效的。

因此,尝试将数据加载到普通的NumPy 2D阵列中,看看是否有助于加快速度。它应该。

我在1.5 GHz笔记本电脑上试过这个:

x = np.random.randint(0,5,(10000,30))
df = pd.DataFrame(x)
%timeit df.mode(axis=1)
%timeit scipy.stats.mode(x, axis=1)

DataFrame方式需要6秒(!),而SciPy(行主要)方式需要16毫秒才能获得10k行。即使是按主要顺序排列的SciPy也不会慢得多,这让我觉得Pandas版本的效率低于它可能的效率。