当前位置: 首页 > 知识库问答 >
问题:

熊猫loc vs.iloc vs.at vs.iat?

季俭
2023-03-14

最近开始从我的安全地带(R)扩展到Python,我对Pandas中的单元格定位/选择感到有点困惑。我已经阅读了文档,但我很难理解各种本地化/选择选项的实际含义。

我是否有理由使用.loc.iloc而不是at,以及iat,反之亦然?在什么情况下我应该使用哪种方法?

注意:以后的读者要知道,这个问题已经过时了,是在熊猫v0.20之前写的,当时有一个函数叫做. ix。这个方法后来被分成两个-lociloc-以明确区分位置索引和基于标签的索引。请注意,ix由于不一致的行为和难以摸索而停产,并且在熊猫的当前版本中不再存在(

共有3个答案

闻人花蜂
2023-03-14

熊猫从数据帧进行选择有两种主要方式。

  • 按标签

留档使用术语位置来指整数位置。我不喜欢这个术语,因为我觉得它很混乱。整数位置更具描述性,正是. iloc所代表的。这里的关键字是INTEGER-通过整数位置选择时必须使用整数。

在显示摘要之前,让我们确保。。。

大熊猫有三个主要索引。我们有索引运算符本身(括号[])、.loc.iloc。让我们总结一下:

  • []-主要选择列的子集,但也可以选择行。不能同时选择行和列。
  • . loc-仅通过标签选择行和列的子集
  • . iloc-仅通过整数位置选择行和列的子集

我几乎从不使用. at. iat,因为它们没有增加额外的功能,只是性能有了一点提高。除非你有一个非常时间敏感的应用程序,否则我不鼓励使用它们。不管怎样,我们有他们的总结:

  • .at仅按标签选择数据帧中的单个标量值

除了通过标签和整数位置进行选择之外,还存在布尔选择(也称为布尔索引)。

我们将首先关注.loc.iloc之间的差异。在讨论差异之前,重要的是要了解数据帧具有帮助标识每列和每行的标签。让我们看看DataFrame的样本:

df = pd.DataFrame({'age':[30, 2, 12, 4, 32, 33, 69],
                   'color':['blue', 'green', 'red', 'white', 'gray', 'black', 'red'],
                   'food':['Steak', 'Lamb', 'Mango', 'Apple', 'Cheese', 'Melon', 'Beans'],
                   'height':[165, 70, 120, 80, 180, 172, 150],
                   'score':[4.6, 8.3, 9.0, 3.3, 1.8, 9.5, 2.2],
                   'state':['NY', 'TX', 'FL', 'AL', 'AK', 'TX', 'TX']
                   },
                  index=['Jane', 'Nick', 'Aaron', 'Penelope', 'Dean', 'Christina', 'Cornelia'])

所有粗体字都是标签。标签,年龄颜色食品高度得分状态用于列。其他标签,JaneNickAaronPenelopeDeanChristinaCornelia用作行的标签。这些行标签统称为索引。

在DataFrame中选择特定行的主要方法是使用. loc. iloc索引器。这些索引器中的每一个也可以用来同时选择列,但是现在只关注行更容易。此外,每个索引器都使用一组括号,这些括号紧跟在它们的名称之后进行选择。

我们将首先讨论.loc索引器,它仅通过索引或列标签选择数据。在我们的示例数据框架中,我们提供了有意义的名称作为索引的值。许多数据帧没有任何有意义的名称,而是默认为0到n-1之间的整数,其中n是数据帧的长度(行数)。

有许多不同的输入可用于。loc其中三个是

  • 一串

用字符串. loc选择单行

要选择一行数据,请将索引标签放在.loc后面的括号内。

df.loc['Penelope']

这将以序列形式返回数据行

age           4
color     white
food      Apple
height       80
score       3.3
state        AL
Name: Penelope, dtype: object

使用带有字符串列表的. loc选择多行

df.loc[['Cornelia', 'Jane', 'Dean']]

这将返回一个数据帧,其中的行按列表中指定的顺序排列:

使用.loc和切片表示法选择多行

切片表示法由开始、停止和步长值定义。按标签切片时,pandas会在返回中包含停止值。以下是从Aaron到Dean的片段,包括在内。其步长没有明确定义,但默认为1。

df.loc['Aaron':'Dean']

复杂切片可以采用与Python列表相同的方式。

现在让我们转向. iloc。DataFrame中的每一行和每一列数据都有一个定义它的整数位置。这是对输出中直观显示的标签的补充。整数位置仅仅是从顶部/左侧开始的行/列数,从0开始。

有许多不同的输入可用于。iloc其中三个是

  • 一个整数
  • 整数列表
  • 使用整数作为开始和停止值的切片表示法

用整数. iloc选择单行

df.iloc[4]

这会将第5行(整数位置4)作为一个序列返回

age           32
color       gray
food      Cheese
height       180
score        1.8
state         AK
Name: Dean, dtype: object

使用.iloc和整数列表选择多行

df.iloc[[2, -2]]

这将返回第三行和倒数第二行的数据帧:

使用.iloc和切片表示法选择多行

df.iloc[:5:3]

两个. loc/. iloc的一个出色功能是同时选择行和列。在上面的示例中,从每个选择返回所有列。我们可以选择输入类型与行相同的列。我们只需要用逗号分隔行和列选择。

例如,我们可以选择行Jane和Dean,只需列的高度、分数和状态如下:

df.loc[['Jane', 'Dean'], 'height':]

这将为行使用标签列表,为列使用切片表示法

我们可以自然地对. iloc仅使用整数执行类似的操作。

df.iloc[[1,4], 2]
Nick      Lamb
Dean    Cheese
Name: food, dtype: object

. ix用于同时选择标签和整数位置,这很有用,但有时会令人困惑和含糊不清,谢天谢地,它已经被弃用了。如果需要混合使用标签和整数位置进行选择,则必须同时使用标签或整数位置进行选择。

例如,如果我们想选择行NickCornelia以及列2和列4,我们可以使用.loc,方法是将整数转换为具有以下内容的标签:

col_names = df.columns[[2, 4]]
df.loc[['Nick', 'Cornelia'], col_names] 

或者,使用get\u locindex方法将索引标签转换为整数。

labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]

loc索引器还可以进行布尔选择。例如,如果我们对查找年龄大于30岁的所有行感兴趣,并且只返回foodscore列,我们可以执行以下操作:

df.loc[df['age'] > 30, ['food', 'score']] 

您可以用. iloc复制它,但不能传递布尔序列。您必须将布尔序列转换成如下所示的Numpy数组

df.iloc[(df['age'] > 30).values, [2, 4]] 

可以使用.loc/.iloc进行列选择。您可以使用冒号选择所有行,如下所示:

df.loc[:, 'color':'score':2]

大多数人都熟悉DataFrame索引操作符的主要用途,即选择列。字符串选择单个列作为序列,字符串列表选择多个列作为数据帧。

df['food']

Jane          Steak
Nick           Lamb
Aaron         Mango
Penelope      Apple
Dean         Cheese
Christina     Melon
Cornelia      Beans
Name: food, dtype: object

使用列表选择多个列

df[['food', 'score']]

人们不太熟悉的是,当使用切片表示法时,通过行标签或整数位置进行选择。这是非常令人困惑的,我几乎从未使用过,但它确实有效。

df['Penelope':'Christina'] # slice rows by label
df[2:6:2] # slice rows by integer location

选择行时,最好使用.loc/.iloc的明确性。仅索引运算符无法同时选择行和列。

df[3:5, 'color']
TypeError: unhashable type: 'slice'

使用.at进行选择与.loc几乎相同,但它仅选择数据帧中的单个“单元格”。我们通常将此单元格称为标量值。要使用.at,请向其传递一个以逗号分隔的行和列标签。

df.at['Christina', 'color']
'black'

使用.iat进行选择与.iloc几乎相同,但它只选择单个标量值。必须为行和列位置传递一个整数

df.iat[2, 5]
'FL'
吴建中
2023-03-14

已针对pandas0.20更新,因为ix已被弃用。这不仅演示了如何使用locilocatiat设置值,还演示了如何实现基于位置/标签的混合索引。

loc-基于标签的
允许您将一维数组作为索引器传递。数组可以是索引或列的切片(子集),也可以是长度等于索引或列的布尔数组。

特别注意:当传递标量索引器时,loc可以指定以前不存在的新索引或列值。

# label based, but we can use position values
# to get the labels from the index object
df.loc[df.index[2], 'ColName'] = 3
df.loc[df.index[1:3], 'ColName'] = 3

iloc-基于位置的
类似于loc,除了位置而不是索引值。但是,不能分配新的列或索引。

# position based, but we can get the position
# from the columns object via the `get_loc` method
df.iloc[2, df.columns.get_loc('ColName')] = 3
df.iloc[2, 4] = 3
df.iloc[:3, 2:4] = 3

at-基于标签的
与标量索引器的loc非常相似。无法对数组索引器进行操作。可以分配新的索引和列。

loc的优点是速度更快。
缺点是不能使用数组作为索引器。

# label based, but we can use position values
# to get the labels from the index object
df.at[df.index[2], 'ColName'] = 3
df.at['C', 'ColName'] = 3

iat-基于位置的
工作原理类似于iloc。无法在数组索引器中工作。不能分配新的索引和列。

与iloc相比,iloc的优点是速度更快。
缺点是不能将数组用于索引器。

# position based, but we can get the position
# from the columns object via the `get_loc` method
IBM.iat[2, IBM.columns.get_loc('PNL')] = 3

set\u value-基于标签的
与标量索引器的loc非常相似。无法对数组索引器进行操作。可以指定新的索引和列

优势超快,因为开销非常小
缺点开销非常小,因为pandas没有进行大量的安全检查。使用风险自负。此外,这并非用于公共用途。

# label based, but we can use position values
# to get the labels from the index object
df.set_value(df.index[2], 'ColName', 3)

set_valuewithtakable=True-基于位置的
类似于iloc。无法在数组索引器中工作。不能!分配新的索引和列。

优势超快,因为开销非常小
缺点开销非常小,因为pandas没有进行大量的安全检查。使用风险自负。此外,这并非用于公共用途。

# position based, but we can get the position
# from the columns object via the `get_loc` method
df.set_value(2, df.columns.get_loc('ColName'), 3, takable=True)
贲宜春
2023-03-14

loc:仅处理索引
iloc:处理位置
at:获取标量值。这是一个非常快速的loc
iat:获取标量值。这是一个非常快速的iloc

还有,

atiat用于访问标量,即数据框中的单个元素,而lociloc是同时访问多个元素的组件,可能执行矢量化操作。

http://pyciencia.blogspot.com/2015/05/obtener-y-filtrar-datos-de-un-dataframe.html

 类似资料:
  • 问题内容: Python 3.4和Pandas 0.15.0 df是一个数据框,而col1是一列。使用下面的代码,我正在检查是否存在值10,并将此类值替换为1000。 这是另一个例子。这次,我将基于索引更改col2中的值。 这两种都会产生以下警告: 最后, 这会产生类似的警告,并带有以下建议: 我不确定我是否理解警告中指出的讨论。编写这三行代码的更好方法是什么? 请注意,该操作有效。 问题答案:

  • 问题内容: 我想将 大于任意数(在这种情况下为100)的值替换为(因为如此大的值表示实验失败)。以前,我使用它来替换不需要的值: 但是,出现以下错误: 从这个StackExchange问​​题来看,有时似乎可以忽略此警告,但是我不能很好地跟踪讨论,无法确定这是否适用于我的情况。警告基本上是让我知道我将覆盖我的某些值吗? 编辑:据我所知,一切都按其应有的方式进行。作为后续措施,我的替换值方法是否非标

  • 我有一个数据帧,如: 所以我想通过两个“for循环”添加一些列,如: 新的类似数据帧的图片: 我的代码不起作用: 如何编写代码来获得像第二张图片这样的数据帧?

  • 问题内容: 我刚刚发现了json_normalize函数,该函数在获取JSON对象并给我一个熊猫Dataframe时效果很好。现在,我想要反向操作,该操作采用相同的Dataframe并给我一个与原始json具有相同结构的json(或类似json的字典,我可以轻松地将其转换为json)。 这是一个示例:https : //hackersandslackers.com/json-into-pandas

  • 问题内容: 在下面,male_trips是一个大熊猫数据帧,station是一个小熊猫数据帧。对于每个车站ID,我想知道有多少次男性旅行。以下工作可以完成,但是需要很长时间: 我应该怎么做呢? 更新!因此,有两种主要方法:其次是和更简单的方法。我很快完成了,这种方法大获全胜!这是代码: 结果如下: 请注意,以这种速度,用于探索数据 键入 value_counts的速度稍微快一些,而且记不起来了!

  • 我正在读取一个包含多个datetime列的csv文件。我需要在读取文件时设置数据类型,但datetimes似乎是个问题。例如: 运行时出现错误: 不理解数据类型"datetime" 通过pandas在事实之后转换列。to_datetime()不是一个选项,我不知道哪些列将成为datetime对象。这些信息可以更改,并且来自于通知我的数据类型列表的任何信息。 或者,我尝试用numpy.genfrom

  • 问题内容: 我有一个包含多个列的数据集,我希望对其进行一次热编码。但是,我不想为每个编码都有编码,因为所说的列与所说的项目有关。我想要的是一组使用所有列的虚拟变量。请参阅我的代码以获得更好的解释。 假设我的数据框如下所示: 如果我执行 输出将是 但是,我想获得的是这样的东西: 代替具有表示编码,例如多列的和,我只希望有一组(,,等等)与值时任何在列中的值的,,显示出来。 需要说明的是,在我的原始数

  • 问题内容: 我有一系列的格式,需要更改每个条目的日期。我想到了许多简单的解决方案,但是没有一个对我有用。目前,唯一有效的方法是 将系列设置为索引 从索引中查询月份和年份 使用年,月和1重建新的时间序列 真的不是那么复杂,是吗?有一个月开始,但是不幸的是,这没有用。该方法似乎没有任何功能,而当系列是一列而不是索引本身(的一部分)时,功能甚至更少。 问题答案: 您可以使用和,例如: 给出: