禄与伊洛克vs ix vs. at iat?

最近开始从我安全的地方(R)分支到Python,并且被Pandas的单元本地化/select所困惑。 我已经阅读了文档,但是我很难理解各种本地化/select选项的实际意义。

是否有一个原因,我应该使用.loc.iloc最常用的选项.ix

我知道.locilocatiat可以提供.ix不能提供的一些保证的正确性,但是我也已经读到了.ix往往是全面最快的解决scheme。

有人可以解释真实世界,推导利用除.ix其他最佳做法吗?

loc:只在索引上工作
iloc:在职位上工作
ix:您可以从数据框中获取数据,而不需要索引
在:得到标量值。 这是一个非常快的地方
iat:获取标量值。 这是一个非常快速的iloc

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

 df = pd.DataFrame({'A':['a', 'b', 'c'], 'B':[54, 67, 89]}, index=[100, 200, 300]) df AB 100 a 54 200 b 67 300 c 89 In [19]: df.loc[100] Out[19]: A a B 54 Name: 100, dtype: object In [20]: df.iloc[0] Out[20]: A a B 54 Name: 100, dtype: object In [24]: df2 = df.set_index([df.index,'A']) df2 Out[24]: B A 100 a 54 200 b 67 300 c 89 In [25]: df2.ix[100, 'a'] Out[25]: B 54 Name: (100, a), dtype: int64 

更新了pandas 0.20因为ix已被弃用。 这不仅certificate了如何使用locilocatiatset_value ,还有如何实现基于混合位置/标签的索引。


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是,这是更快。
缺点是你不能使用索引器的数组。

 # 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_value基于标签
对于标量索引器而言,它与loc很相似。 无法在数组索引器上操作。 能够! 分配新的索引和列

优点超快速,因为有很less的开销!
缺点由于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 with takable=True基于位置
iloc类似。 无法在数组索引器中工作。 不能! 分配新的索引和列。

优点超快速,因为有很less的开销!
缺点由于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) 

pandas通过DataFrame进行select有两种主要方式。

  • 标签
  • 通过整数位置

文档使用术语位置来指整数位置 。 我不喜欢这个术语,因为我觉得它很混乱。 整数位置更具描述性,正是.iloc代表的。 这里的关键词是INTEGER – 在整数位置select时必须使用整数。

在展示总结之前,让我们确保…

.ix被弃用和模糊,不应该被使用

有三个主要的大pandas指数。 我们有索引操作符本身(括号[].iloc.iloc 。 我们来总结一下:

  • [] – 主要select列的子集,但也可以select行。 不能同时select行和列。
  • .loc – 仅按标签select行和列的子集
  • .iloc – 仅按整数位置select行和列的子集

我几乎从不使用.iat.iat因为它们不增加额外的function,而且只增加一点小小的性能。 我会劝阻他们的使用,除非你有一个非常时间敏感的应用程序。 无论如何,我们有他们的总结:

  • .at仅通过标签在DataFrame中select单个标量值
  • .iat只能通过整数位置在.iatselect一个标量值

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


下面显示了解释.loc.iloc ,布尔select和.iat.iat的示例

我们将首先关注.loc.iloc之间的区别。 在讨论差异之前,了解DataFrame具有帮助标识每列和每行的标签是很重要的。 我们来看一个示例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']) 

在这里输入图像描述

所有粗体字都是标签。 标签, agecolorfoodheightscorestate用于 。 其他品牌, JaneNickAaronPenelopeDeanChristinaCornelia被用作行的标签。 总的来说,这些行标签被称为索引


在DataFrame中select特定行的主要方法是使用.loc.iloc索引器。 这些索引器中的每一个也可以用来同时select列,但现在更容易集中在行上。 而且,每个索引器都使用一组紧跟其名称的括号来进行select。

.loc只能通过标签select数据

我们将首先讨论仅通过索引或列标签select数据的.loc索引器。 在我们的示例DataFrame中,我们提供了有意义的名称作为索引的值。 许多DataFrames将不会有任何有意义的名称,而是默认为0到n-1的整数,其中n是DataFrame的长度。

有三种不同的input可以用于.loc

  • 一个string
  • string列表
  • 切片符号使用string作为开始和停止值

用一个stringselect带有.loc的单个行

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

 df.loc['Penelope'] 

这将返回一行数据作为一个系列

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

使用string列表select带有.loc的多行

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

这会按照列表中指定的顺序返回一个DataFrame:

在这里输入图像描述

用切片符号select多个带.loc的行

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

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

在这里输入图像描述

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

.iloc只能通过整数位置来select数据

现在我们来.iloc 。 DataFrame中的每一行和一列数据都有一个定义它的整数位置。 这是在输出中可视化显示的标签之外的。 整数位置只是从0开始的顶部/左侧的行数/列数。

有三种不同的input可以用于.iloc

  • 一个整数
  • 整数列表
  • 切片符号使用整数作为开始和停止值

用一个整数select带有.iloc的单个行

 df.iloc[4] 

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

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

用整数列表select多行.iloc

 df.iloc[[2, -2]] 

这将返回第三个和第二个到最后一个行的DataFrame:

在这里输入图像描述

用切片符号select多行.iloc

 df.iloc[:5:3] 

在这里输入图像描述


使用.loc和.iloc同时select行和列

.loc/.iloc一个很好的能力是它们同时select行和列的能力。 在上面的示例中,所有列都是从每个select中返回的。 我们可以select与input行types相同的列。 我们只需要用逗号分隔行和列的select。

例如,我们可以selectJane和Dean,只有列的高度,得分和状态如下所示:

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

在这里输入图像描述

这使用行的列表标签和列的切片符号

我们自然可以用.iloc做类似的操作, .iloc用整数。

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

同时select标签和整数位置

.ix被用来与标签和整数位置同时进行select,这有时候是有用的,但是有时会令人困惑和模糊,幸好它已经被弃用了。 如果您需要使用标签和整数位置混合进行select,则必须同时创buildselect标签或整数位置。

例如,如果我们想要selectNickCornelia以及第2列和第4列,我们可以使用.loc将整数转换为标签,如下所示:

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

或者,也可以使用get_loc索引方法将索引标签转换为整数。

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

布尔select

.loc索引器也可以做布尔select。 例如,如果我们有兴趣查找年龄在30岁以上的所有行,并返回foodscore列,我们可以执行以下操作:

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

你可以用.iloc复制这个,但是你不能把它传给布尔系列。 您必须将布尔型系列转换为像这样的numpy数组:

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

select所有行

可以使用.loc/.iloc作为列select。 你可以使用像这样的冒号来select所有的行:

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

在这里输入图像描述


索引操作符[]可以切片也可以同时select行和列。

大多数人都熟悉DataFrame索引操作符的主要用途,即select列。 一个stringselect一个列作为一个Series,一个string列表select多个列作为一个DataFrame。

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

使用列表select多个列

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

在这里输入图像描述

人们不太熟悉的是,当使用切片符号时,则通过行标签或整数位置进行select。 这是非常混乱,我几乎从来没有使用,但它确实工作。

 df['Penelope':'Christina'] # slice rows by label 

在这里输入图像描述

 df[2:6:2] # slice rows by integer location 

在这里输入图像描述

用于select行的.loc/.iloc的显式性是非常优选的。 索引操作符本身不能同时select行和列。

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

.iat.iatselect

使用.atselect与.loc几乎完全相同,但只能在DataFrame中select一个“单元”。 我们通常将这个单元格称为标量值。 要使用.loc ,传递一个由逗号分隔的行和列标签。

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

.iatselect与.iat几乎相同,但只select一个标量值。 您必须为行和列位置传递一个整数

 df.iat[2, 5] 'FL'