我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

访问dataframe变量的内部成员的时候,可以使用.loc().iloc()两个方法,这两个方法都可以设置获取一行或者一列或者某个具体位置的成员。然而,还有另外一对方法.at().iat(),和.loc()/iloc()十分类似。也可以用来定位dataframe变量的一些成员。

苏南大叔:dataframe变量,对比loc/iloc方法,at/iat方法有何不同之处? - dataframe-at-iat
dataframe变量,对比loc/iloc方法,at/iat方法有何不同之处?(图6-1)

苏南大叔的“程序如此灵动”博客,拒绝文章批量复制抄袭。本文测试环境:win10python@3.11.0numpy@1.24.2pandas@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变量,对比loc/iloc方法,at/iat方法有何不同之处? - code1-loc
dataframe变量,对比loc/iloc方法,at/iat方法有何不同之处?(图6-2)

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  二赖子    宠物

苏南大叔:dataframe变量,对比loc/iloc方法,at/iat方法有何不同之处? - code2-at
dataframe变量,对比loc/iloc方法,at/iat方法有何不同之处?(图6-3)

.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()是可以使用:操作符的,这是和网上其它的教程不一样的地方。

苏南大叔:dataframe变量,对比loc/iloc方法,at/iat方法有何不同之处? - code3-at
dataframe变量,对比loc/iloc方法,at/iat方法有何不同之处?(图6-4)

如果说.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()+冒号的组合,不能读取,只能设置。

苏南大叔:dataframe变量,对比loc/iloc方法,at/iat方法有何不同之处? - code4-at-loc
dataframe变量,对比loc/iloc方法,at/iat方法有何不同之处?(图6-5)

.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

苏南大叔:dataframe变量,对比loc/iloc方法,at/iat方法有何不同之处? - code5-iat
dataframe变量,对比loc/iloc方法,at/iat方法有何不同之处?(图6-6)

表格对比总结

函数参数读取一个设置一个读取一组设置一组
.loc()使用标签名可以可以可以可以
.iloc()使用数字索引可以可以可以可以
.at()使用标签名可以可以报错可以
.iat()使用数字索引可以可以报错报错

既生瑜何生亮,既然loc()iloc()非常好用,为啥还做一个看起来一样的.at()iat()方法呢?况且这个.at()iat()明显不如loc()iloc()好用。个人建议,还是老老实实的使用.loc()或者.iloc()比较好。

结束语

大家对待这个.at().iat()方法,有什么独特的见解么?欢迎留言。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python