如何加快此方法的速度?



我正在数据科学代码中进行优化,我发现了一种缓慢的方法。我想要一些改进它的提示。现在我正在使用 43000 行的数据帧进行测试,执行大约需要 50 秒。

我已经阅读了.loc.iloc.at.iat.iterrows.itertuples的方法,以便在数据框中迭代以获得更好的性能,我认为这里就是这种情况,因为实际上该方法是在 for 循环中运行的。

def slow_method(sliced_data_frame, labels_nd_array):
sliced_data_frame['column5'] = -1  # creating a new column
for label in np.unique(labels_nd_array):
sliced_data_frame['column5'][labels_nd_array == label] = label,
return sliced_data_frame

此外,我很难理解带有 [labels_nd_array == 标签] 的 for 循环内部发生了什么,sliced_data_frame['column5']的第一条语句正在选择刚刚创建的列,但下一条语句让我感到困惑。

我同意 Poolka 的评论,问题中的代码似乎只不过是sliced_data_frame['column5'] = labels_nd_array.这是因为,回答你的 dupts 关于[labels_nd_array == label],您首先选择创建的列,然后访问其索引,其中labels_nd_array ==标签,然后在此处将其值从-1更改为标签

一般来说,在可能的情况下,应该避免循环行,特别是在 Pandas 中,甚至 DataFrame.iterrows(( 也为每一行创建一个系列。例如,正如您所注意到的,本主题通常在堆栈溢出中解决。虽然在这里你正在循环访问一个 numpy 数组,但这似乎没有必要,还要考虑到你在每次迭代时检查的条件。

一般来说,如果有其他特定原因需要迭代行,我建议使用 DataFrame.to_numpy(((或类似的选项(并在 NumPy 中工作。在 NumPy 中,默认情况下迭代行通常更快,但始终首先尝试矢量化。最后,一旦进入 NumPy,如果确实需要循环浏览行并且性能是优先事项,则可以使用 Numba。

最新更新