ITPub博客

首页 > 数据库 > 数据库开发技术 > Python小技巧:循环不要再使用loc/iloc啦,用这个让你的代码运行速度更快

Python小技巧:循环不要再使用loc/iloc啦,用这个让你的代码运行速度更快

原创 数据库开发技术 作者:jackzhang 时间:2024-03-21 22:05:02 0 删除 编辑

最近,在我的日常工作中,我注意到到在循环中使用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函数用于使用列索引访问列。

如果在Python循环中使用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 / iat

at和iat表示访问一个标量,即DataFrame中的单个元素,如下所示:

如果我们尝试使用at和iat访问一个序列,那么它会抛出一个错误,如下所示:

  • loc/iloc

loc和iloc意味着可以同时访问多个元素(序列/数据框),底层执行的是向量化操作。

因为,at用于访问标量值,所以它是轻量级的(实现速度很快),而loc用于访问序列或数据框,因此会占用更多的空间和时间。

结论

在Python的循环中使用loc / iloc不是最佳选择,应该尽可能避免使用。相反,我们应该在需要的地方使用at / iat,因为它们比loc / iloc要快得多。

“

另外,请记住,当我们在python的循环外应用向量化运算时,loc / iloc的效率则会更好。

如果你觉得这篇文章对你有用,请“点赞➕在看➕分享➕关注”支持我(关注我,不迷路🤭🤭🤭),你的点赞和关注就是我持续创作分享的动力,让更多的朋友发现并加入我们,共同学习和进步!

Thank you for reading!

- END -


推荐阅读👇👇👇

Python向量化:让你的程序运行速度爆炸性增长

Python探索性数据分析之数据可视化:附实例代码

2024年数据分析师都应该知道的5个高级SQL概念

13个SQL语句:解决90%的数据科学问题!你都知道哪些?



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

请登录后发表评论 登录
全部评论

注册时间:2017-12-19

  • 博文量
    119
  • 访问量
    55951