最近,我在尝试使用 Python 中的循环,并意识到在循环中使用“iloc”/“loc”需要花费大量时间来执行。下一个问题是为什么“loc”花费的时间太长,以及“loc”的替代方案是什么?
本文将通过一些实际例子来回答这些问题。
什么是 loc?
loc[]
函数是一个 pandas 函数,用于使用行索引和列名访问 DataFrame 内的值。当您知道要访问哪一行和哪一列时,可以使用它。
通过一个例子来理解 loc
。我们有以下名为 df 的 pandas DataFrame(如下所示),我们想要访问列“a”中第二行对应的值,即 10。
我们可以使用以下代码访问该值:
类似地,iloc 用于使用索引和列号访问值。
因此,loc 函数用于使用列名访问列,而iloc 函数用于使用列索引访问列。
如果在 Python 中将 loc/iloc 与循环一起使用会发生什么?
想象一下,我们想要在 DataFrame df 中添加一个新列“c”,其值等于“a”列和“b”列的值之和。
使用“for”循环,我们可以遍历我们的 DataFrame 并使用 loc
函数添加新列“c”,如下所示:
使用 loc
进行迭代和更新值所需的时间大约为40 分钟,这是一个很长的时间。
替代方案:使用“at”代替“loc”
我们可以通过用“at”替换“loc”(或用“iat”替换“iloc”)来执行相同的操作,如下所示。
该代码执行时间约为0.7 分钟,比 loc 函数所用时间快 60 倍。
“loc”与“at”在运行时间上为何存在差异?
-
‘at’/‘iat’
at
用于iat
访问标量,即 DataFrame 中的单个元素,如下所示:
如果我们尝试使用以下方式访问系列at
和iat
,则会引发错误,如下所示:
-
‘loc’/‘iloc’
loc
旨在iloc
同时访问多个元素(系列/数据框),可能执行矢量化操作。
因为,at
用于访问缩放器值,所以与loc
用于访问系列/数据帧相比,它是轻量级的(实现速度很快),因此占用更多的空间和时间。
写在最后
在 Python 的循环中使用“loc”/“iloc”并不是最佳选择,应避免使用。相反,我们应该在需要的地方使用“at”/“iat”,因为它们比“loc”/“iloc”快得多。