【问题标题】:How can I speed up this method?我怎样才能加快这种方法?
【发布时间】:2020-01-03 18:54:42
【问题描述】:

我正在对数据科学代码进行优化,但我发现了一个缓慢的方法。我想要一些改进它的提示。现在我正在使用 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 == label] 的 for 循环内部发生了什么,第一条语句 sliced_data_frame['column5'] 正在选择刚刚创建的列,但下一条语句让我感到困惑。

【问题讨论】:

  • 问题中的代码似乎没用。我猜你可能会得到与sliced_data_frame['column5'] = labels_nd_array 相同的结果。如果我错了,请纠正我或添加示例数据和预期结果。

标签: python pandas numpy optimization iteration


【解决方案1】:

我同意 Poolka 的评论,问题中的代码似乎无非是sliced_data_frame['column5'] = labels_nd_array。这是因为,在回答你关于[labels_nd_array == label] 的问题时,你首先选择了创建的列,然后访问它的索引 labels_nd_array == label,在这里将它的值从 -1 em> 到 标签

一般而言,应尽可能避免循环遍历行,尤其是在 Pandas 中,即使 DataFrame.iterrows() 会为每一行创建一个序列。正如您所注意到的,该主题通常在 Stack Overflow 中得到解决,for example。虽然在这里您正在循环一个 numpy 数组,但这似乎没有必要,还要考虑您在每次迭代时检查的条件。

一般来说,如果有其他特定原因需要遍历行,我建议使用 DataFrame.to_numpy()(或类似选项)并在 NumPy 中工作。在 NumPy 中,默认情况下迭代行通常更快,但总是首先尝试向量化。最后,一旦在 NumPy 中,如果确实需要循环遍历行并且性能是优先考虑的问题,您可以使用 Numba。

【讨论】:

    猜你喜欢
    • 2014-08-13
    • 2011-09-27
    • 2010-11-04
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多