不要再在pandas循环中使用 loc/iloc 了!

学术   2024-10-16 11:10   上海  

转自:数据STUDIO 最近在尝试使用 Python 中的循环,并意识到在循环中使用“iloc”/“loc”需要花费大量时间来执行。下一个问题是为什么“loc”花费的时间太长,以及“loc”的替代方案是什么?

本文中,将通过一些实际例子来回答这些问题。

什么是 loc?

loc[] 函数是一个 pandas 函数,用于使用行索引和列名访问 DataFrame 内的值。当您知道要访问哪一行和哪一列时,可以使用它。

通过一个例子来理解 loc。我们有以下名为 df 的 pandas DataFrame(如下所示),我们想要访问列“a”中第二行对应的值,即 10。

我们可以使用以下代码访问该值:

##df.loc[index, column_name]

df.loc[1,'a']

### 输出:10

类似地,iloc 用于使用索引和列号访问值。

##df.loc[index, column_number]

df.iloc[1,0]

### 输出:10

因此,loc 函数用于使用列名访问列,而iloc 函数用于使用列索引访问列。

如果在 Python 中将 loc/iloc 与循环一起使用会发生什么?

想象一下,我们想要在 DataFrame df 中添加一个新列“c”,其值等于“a”列和“b”列的值之和。

使用“for”循环,我们可以遍历我们的 DataFrame 并使用 loc 函数添加新列“c”,如下所示:

import timestart = time.time() 

# 遍历 DataFrame df 
for index, row in df.iterrows(): 
        df.loc[index, 'c' ] = row.a + row.b 

end = time.time() 
print (end - start) 

### 所用时间:2414 秒

使用 loc 进行迭代和更新值所需的时间大约为40 分钟,这是一个很长的时间。

替代方案:使用“at”代替“loc”

我们可以通过用“at”替换“loc”(或用“iat”替换“iloc”)来执行相同的操作,如下所示。

import timestart = time.time() 

# 遍历 DataFrame 
for index, row in df.iterrows(): 
    df.at[index, 'c' ] = row.a + row.b 

end = time.time() 
print (end - start) 
### 所用时间:40 秒

该代码执行时间约为0.7 分钟,比 loc 函数所用时间快 60 倍。

“loc”与“at”在运行时间上为何存在差异?

  • ‘at’/‘iat’

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

df.at[2,'a']
### 输出:22

df.iat[2,0]
### 输出:22

如果我们尝试使用以下方式访问系列atiat,则会引发错误,如下所示:

## 这将导致错误,因为我们试图访问多行
df.at[:3,'a']
### 输出:ValueError: 基于整数索引的索引只能有整数索引器
  • ‘loc’/‘iloc’

loc旨在iloc同时访问多个元素(系列/数据框),可能执行矢量化操作。

df.loc[:3,'a']
### 输出
##0 26 
##1 10 
##2 22 
##3 22

df.loc[:3,0]
### 输出
##0 26 
##1 10 
##2 22 
##3 22

因为,at用于访问缩放器值,所以与loc用于访问系列/数据帧相比,它是轻量级的(实现速度很快),因此占用更多的空间和时间。

写在最后

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

-END-
分享一份Python可视化教程(基于py可视化利器seaborn):530张图形+8000行代码+详细代码注释+后续免费更新+学习交流群,教程部分内容,

例如,

👉还在用AI拼图,试试这个Python工具!

👉Python seaborn超级细节完结篇-联合美化

👉141个图表,完美展示数据分类关系!

👉53个图表,完美展示数据组合关系!

👉55个热力图heatmap代码模版~

👉51个图表,完美展示数据分布关系!

👉又一个配色新工具,颜色盘多达2500+类!

👉可视化配色工具,colormap多达3174类,数万种颜色!



每类图表包含详细代码+详细代码注释,多达8000行代码,例如,


如何加入学习?

👇加入学习收费备注:169

✅解锁获取6大权限:

  1. 8000+行代码(复制即可运行)
  2. 在线教程文档(清晰目录)
  3. 依赖数据(免费下载)
  4. 交流群
  5. 后续更新
  6. 定期抽最新机器学习、数据科学类书籍

点个 在看、赞 就是最大的支持

pythonic生物人
分享AI、Python/R可视化、统计、科研!
 最新文章