最近开始从我的安全地带(R)扩展到Python,我对Pandas
中的单元格定位/选择感到有点困惑。我已经阅读了文档,但我很难理解各种本地化/选择选项的实际含义。
我是否有理由使用.loc
或.iloc
而不是at
,以及iat
,反之亦然?在什么情况下我应该使用哪种方法?
注意:以后的读者要知道,这个问题已经过时了,是在熊猫v0.20之前写的,当时有一个函数叫做. ix
。这个方法后来被分成两个-loc
和iloc
-以明确区分位置索引和基于标签的索引。请注意,ix
由于不一致的行为和难以摸索而停产,并且在熊猫的当前版本中不再存在(
熊猫从数据帧进行选择有两种主要方式。
留档使用术语位置来指整数位置。我不喜欢这个术语,因为我觉得它很混乱。整数位置更具描述性,正是. 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'])
所有粗体字都是标签。标签,年龄
,颜色
,食品
,高度
,得分
和状态
用于列。其他标签,Jane
,Nick
,Aaron
,Penelope
,Dean
,Christina
,Cornelia
用作行的标签。这些行标签统称为索引。
在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
用于同时选择标签和整数位置,这很有用,但有时会令人困惑和含糊不清,谢天谢地,它已经被弃用了。如果需要混合使用标签和整数位置进行选择,则必须同时使用标签或整数位置进行选择。
例如,如果我们想选择行Nick
和Cornelia
以及列2和列4,我们可以使用.loc
,方法是将整数转换为具有以下内容的标签:
col_names = df.columns[[2, 4]]
df.loc[['Nick', 'Cornelia'], col_names]
或者,使用get\u loc
index方法将索引标签转换为整数。
labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]
loc索引器还可以进行布尔选择。例如,如果我们对查找年龄大于30岁的所有行感兴趣,并且只返回food
和score
列,我们可以执行以下操作:
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'
已针对pandas
0.20
更新,因为ix
已被弃用。这不仅演示了如何使用loc
,iloc
,at
,iat
,设置值
,还演示了如何实现基于位置/标签的混合索引。
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_value
withtakable=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)
loc:仅处理索引
iloc:处理位置
at:获取标量值。这是一个非常快速的loc
iat:获取标量值。这是一个非常快速的iloc
还有,
at
和iat
用于访问标量,即数据框中的单个元素,而loc
和iloc
是同时访问多个元素的组件,可能执行矢量化操作。
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重建新的时间序列 真的不是那么复杂,是吗?有一个月开始,但是不幸的是,这没有用。该方法似乎没有任何功能,而当系列是一列而不是索引本身(的一部分)时,功能甚至更少。 问题答案: 您可以使用和,例如: 给出: