dataframe变量,对比loc/iloc方法,at/iat方法有何不同之处?
发布于 作者:苏南大叔 来源:程序如此灵动~访问dataframe
变量的内部成员的时候,可以使用.loc[]
和.iloc[]
两个方法,这两个方法都可以设置获取一行或者一列或者某个具体位置的成员。然而,还有另外一对方法.at[]
和.iat[]
,和.loc[]
/iloc[]
十分类似。也可以用来定位dataframe
变量的一些成员。
苏南大叔的“程序如此灵动”博客,拒绝文章批量复制抄袭。本文测试环境:win10
,python@3.11.0
,numpy@1.24.2
,pandas@1.5.3
。本文探讨dataframe
如何利用.at[]
和.iat[]
定位元素。
dataframe的.loc[]和.iloc[]
dataframe
变量的.loc[]
和.iloc[]
两个方法,在前面的文章里面有过描述:
总的思路就是:
.loc[]
,使用被定义的便签信息,可以使用:
来定位一组数据。.iloc[]
,使用原始的数字索引,也可以使用:
来定位一组数据。
测试代码:
import pandas as pd
df = pd.DataFrame([
('虎子', "狗"),
('老许', "猫"),
('二赖子', "狗")],
index=["a0", "a1", "a2"],
columns=("姓名", "种类")
)
print(df)
df.loc['a0', '种类'] = "狐狸狗"
df.iloc[2, 1] = "胖狗"
print(df)
df.loc[:, '种类'] = "宠物"
df.iloc[0:1, 1] = "可爱宠物"
print(df)
输出:
姓名 种类
a0 虎子 狗
a1 老许 猫
a2 二赖子 狗
姓名 种类
a0 虎子 狐狸狗
a1 老许 猫
a2 二赖子 胖狗
姓名 种类
a0 虎子 可爱宠物
a1 老许 宠物
a2 二赖子 宠物
dataframe的.at[]和.iat[]
dataframe
变量的.at[]
和.iat[]
两个方法,基本上是类似.loc[]
和.iloc[]
两个方法的。
.at[]
,使用被定义的便签信息,可以使用:
来定位一组数据。.iat[]
,使用原始的数字索引,但是【不可以使用:
】来定位一组数据。
参考代码:
import pandas as pd
df = pd.DataFrame([
('虎子', "狗"),
('老许', "猫"),
('二赖子', "狗")],
index=["a0", "a1", "a2"],
columns=("姓名", "种类")
)
print(df)
df.at['a0', '种类'] = "狐狸狗"
df.iat[2, 1] = "胖狗"
print(df)
df.at[:, '种类'] = "宠物"
df.iat[0:1, 1] = "可爱宠物" # 报错
# df.iat[0, 1] = "可爱宠物"
print(df)
输出:
姓名 种类
a0 虎子 狗
a1 老许 猫
a2 二赖子 狗
姓名 种类
a0 虎子 狐狸狗
a1 老许 猫
a2 二赖子 胖狗
姓名 种类
a0 虎子 可爱宠物
a1 老许 宠物
a2 二赖子 宠物
.at[]只能设置一组,不能读取一组
.at[]
方法挺邪门的,
- 可以用于设置或读取某个具体位置的成员。
- 也能【设置】成组数据,但是试图【读取成组数据】的时候,就会报错了。
测试代码:
import pandas as pd
df = pd.DataFrame([
('虎子', "狗"),
('老许', "猫"),
('二赖子', "狗")],
index=["a0", "a1", "a2"],
columns=("姓名", "种类")
)
df.at['a0', '种类'] = "狐狸狗"
print(df.at['a0', '种类'])
df.at[:, '种类'] = "宠物"
print(df)
print(df.at[:, '种类']) # TypeError: 'slice(None, None, None)' is an invalid key
报错信息如下:
TypeError: 'slice(None, None, None)' is an invalid key
需要特别声明的是:与此同时,.at[]
是可以使用:
操作符的,这是和网上其它的教程不一样的地方。
如果说.iat[]
和.iloc[]
有着很明显的差异(是否可以选择一组数据),那么.at[]
和.loc[]
也可以用于获取多个数据(例如一列和一行),那么,.at[]
和.loc[]
难道是等同的函数?测试代码:
import pandas as pd
df = pd.DataFrame([
('虎子', "狗")],
index=["a0"],
columns=("姓名", "种类")
)
df1 = df.copy()
df.loc[:, 1] = "胖狗loc" # 注意这个是loc,不是iloc,实际上使用了不存在的列名1
print(df)
print(df1.loc["a0", "种类"])
print(df.loc[:, 1]) # loc能设置能读取,虽然设置错了吧
df1.at[:, 1] = "胖狗at" # 注意这个是at,不是iat,实际上使用了不存在的列名1
print(df1.at["a0", "种类"])
# print(df1.at[:, 1]) # 这里报错,at只能设置不能读取,而且设置错了,和loc一样
可见,两者还是有细微区别的,区别就在于.at[]
+冒号的组合,不能读取,只能设置。
.iat[]不能定位一组数据
.iat[]
,里面不能使用:
操作符,也就是说不能定位到多条数据,只能定位到某个具体的值。
测试代码:
import pandas as pd
df = pd.DataFrame([
('虎子', "狗"),
('老许', "猫"),
('二赖子', "狗")],
index=["a0", "a1", "a2"],
columns=("姓名", "种类")
)
df.iat[2, 1] = "胖狗"
print(df)
df.iat[0:1, 1] = "可爱宠物" # 报错
print(df)
试图使用:
操作符的,会得到下面的错误提示信息:
ValueError: iAt based indexing can only have integer indexers
表格对比总结
函数 | 参数 | 读取一个 | 设置一个 | 读取一组 | 设置一组 |
---|---|---|---|---|---|
.loc[] | 使用标签名 | 可以 | 可以 | 可以 | 可以 |
.iloc[] | 使用数字索引 | 可以 | 可以 | 可以 | 可以 |
.at[] | 使用标签名 | 可以 | 可以 | 报错 | 可以 |
.iat[] | 使用数字索引 | 可以 | 可以 | 报错 | 报错 |
既生瑜何生亮,既然loc[]
和iloc[]
非常好用,为啥还做一个看起来一样的.at[]
和iat[]
方法呢?况且这个.at[]
和iat[]
明显不如loc[]
和iloc[]
好用。个人建议,还是老老实实的使用.loc[]
或者.iloc[]
比较好。
结束语
大家对待这个.at[]
和.iat[]
方法,有什么独特的见解么?欢迎留言。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。