禄与伊洛克vs ix vs. at iat?
最近开始从我安全的地方(R)分支到Python,并且被Pandas
的单元本地化/select所困惑。 我已经阅读了文档,但是我很难理解各种本地化/select选项的实际意义。
是否有一个原因,我应该使用.loc
或.iloc
最常用的选项.ix
?
我知道.loc
, iloc
, at
和iat
可以提供.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了如何使用loc
, iloc
, at
, iat
, set_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
只能通过整数位置在.iat
select一个标量值
除了通过标签和整数位置进行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'])
所有粗体字都是标签。 标签, age
, color
, food
, height
, score
和state
用于列 。 其他品牌, Jane
, Nick
, Aaron
, Penelope
, Dean
, Christina
, Cornelia
被用作行的标签。 总的来说,这些行标签被称为索引 。
在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标签或整数位置。
例如,如果我们想要selectNick
和Cornelia
以及第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岁以上的所有行,并返回food
和score
列,我们可以执行以下操作:
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
和.iat
select
使用.at
select与.loc
几乎完全相同,但只能在DataFrame中select一个“单元”。 我们通常将这个单元格称为标量值。 要使用.loc
,传递一个由逗号分隔的行和列标签。
df.at['Christina', 'color'] 'black'
.iat
select与.iat
几乎相同,但只select一个标量值。 您必须为行和列位置传递一个整数
df.iat[2, 5] 'FL'