让我说我有一个包含100万行和30列的数据帧。 我想在数据框中添加一列,其值为“前30列的最常值”。我还想添加“前30列的第二个最常见的值”
我知道你可以为“前30列的最常值”做df.mode(axis = 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版本的效率低于它可能的效率。