最近,在我的日常工作中,我注意到到在循环中使用iloc/loc会花费大量时间来执行。接下来的问题是,为什么loc会花费太多时间,以及loc的替代选项是什么?
在本文中,我们将通过一些实际示例来回答这些问题。
loc—— 如果你还不了解!loc[]函数是pandas库的一个函数,它通过行索引和列名来访问DataFrame的值。当需要访问特定的行和列时,它非常有用。
让我通过一个例子来解释loc。考虑下面提供的数据框:
df = pd.DataFrame(data=np.random.randint(0, 50, size=(500000, 2)),
columns=['a', 'b'])
我们的目标是检索第二行在'a'列中对应的值,即19。可以通过下面的代码实现:
类似地,iloc则是通过使用行和列索引访问值。
因此,loc函数用于使用列名访问列,而iloc函数用于使用列索引访问列。
loc/iloc会发生什么?想象一下,我们想要添加一个新的列c到我们的数据框 df 中,其值等于列a和列b的值之和。
使用for循环,我们可以遍历DataFrame,并使用loc函数添加一个新的列c,如下所示:
import time
start = time.time()
for index, row in df.iterrows():
df.loc[index, 'c'] = row.a + row.b
end = time.time()
print(f'Time taken: {round(end-start, 2)} seconds!')
可以看出使用loc来迭代和更新值(50万行)用时大约57.15秒,看起来可以接受,但是如果数据量继续增大呢,比如500万行甚至更多,那耗时将会显著增加。
at代替loc我们可以通过将loc替换为at(或将iloc替换为iat)来执行相同的操作,如下所示。
import time
start = time.time()
for index, row in df.iterrows():
df.at[index, 'c'] = row.a + row.b
end = time.time()
print(f'Time taken: {round(end-start, 2)} seconds!')
这种方法代码执行时间将近34秒,比loc函数所用的时间快约1.7倍。
loc vs at为什么在运行时存在差异?at / iatat和iat表示访问一个标量,即DataFrame中的单个元素,如下所示:
如果我们尝试使用at和iat访问一个序列,那么它会抛出一个错误,如下所示:
loc/ilocloc和iloc意味着可以同时访问多个元素(序列/数据框),底层执行的是向量化操作。
因为,at用于访问标量值,所以它是轻量级的(实现速度很快),而loc用于访问序列或数据框,因此会占用更多的空间和时间。
在Python的循环中使用loc / iloc不是最佳选择,应该尽可能避免使用。相反,我们应该在需要的地方使用at / iat,因为它们比loc / iloc要快得多。
“另外,请记住,当我们在python的循环外应用向量化运算时,
loc/iloc的效率则会更好。
如果你觉得这篇文章对你有用,请“点赞➕在看➕分享➕关注”支持我(关注我,不迷路🤭🤭🤭),你的点赞和关注就是我持续创作分享的动力,让更多的朋友发现并加入我们,共同学习和进步!
Thank you for reading!
- END -
推荐阅读👇👇👇


原文作者:数据派探险家;如有侵权,请联系管理员删除。