我正在用数据科学代码进行优化,但发现了一种缓慢的方法。我想要一些改善的技巧。现在,我正在测试一个包含43000行的数据帧,并且大约需要50秒才能执行。
我已阅读有关方法trash = moesearch.search(...)
print(type(trash))
print(trash)
for i, j in enumerate(trash):
print(type(j))
...
,.loc
,.iloc
,.at
,.iat
和.iterrows
的知识,以获取更好的性能迭代在数据帧中,我认为情况会如此,因为实际上该方法在for循环中运行。
.itertuples
我也很难用[labels_nd_array == label]来了解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
选择了刚刚创建的列,但是下一条使我困惑。
答案 0 :(得分:0)
我同意Poolka的评论,问题中的代码似乎只做sliced_data_frame['column5'] = labels_nd_array
。这是因为,在回答关于[labels_nd_array == label]
的重复项时,您首先选择了创建的列,然后在 labels_nd_array == label 处访问其索引,然后将其值从 -1更改为到 label 。
通常,应尽可能避免在行上循环,尤其是在Pandas中,即使DataFrame.iterrows()也会为每行创建一个序列。如您所见,此主题通常在堆栈溢出for example中得到解决。在这里,您遍历一个numpy数组时,这似乎没有必要,而且还要考虑每次迭代时要检查的条件。
通常,如果还有其他遍历行的特定原因,我建议使用DataFrame.to_numpy()(或类似选项)并在NumPy中工作。在NumPy中,默认情况下,遍历行通常更快,但始终尝试进行向量化。最后,在NumPy中,如果确实需要遍历行并且优先考虑性能,则可以使用Numba。