pandas从DataFrame中进行选择有两种主要方式。
通过标签
按整型位置
本文档使用术语position来表示整数位置。我不喜欢这个术语,因为我觉得它令人困惑。整数位置更具有描述性,这正是.iloc所代表的。这里的关键字是INTEGER—在按整数位置选择时必须使用整数。
在展示摘要之前,让我们确认一下…
.ix已弃用且具有歧义,永远不应该使用
有三个主要的熊猫索引器。我们有索引操作符本身(括号[])、.loc和.iloc。让我们来总结一下:
[] -主要选择列的子集,但也可以选择行。不能同时选择行和列。
.loc -仅通过标签选择行和列的子集
.iloc -仅通过整数位置选择行和列的子集
我几乎从不使用.at或.iat,因为它们不会增加额外的功能,而且只会增加少量的性能。我不建议使用它们,除非您的应用程序对时间非常敏感。无论如何,我们有他们的总结:
.at仅通过标签选择DataFrame中的单个标量值
.iat仅通过整数位置在DataFrame中选择单个标量值
除了根据标签和整数位置进行选择外,还有布尔选择,也称为布尔索引。
下面是解释.loc, .iloc,布尔选择和.at和.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'])
所有加粗的字都是标签。这些列使用标签、年龄、颜色、食物、身高、分数和状态。其他标签,Jane, Nick, Aaron, Penelope, Dean, Christina, Cornelia被用作行标签。这些行标签统称为索引。
在DataFrame中选择特定行的主要方法是使用.loc和.iloc索引器。每一个索引器都可以用来同时选择列,但是现在只关注行更容易。此外,每个索引器都使用一组括号,紧跟着他们的名字来进行选择。
.loc只根据标签选择数据
我们将首先讨论.loc索引器,它只根据索引或列标签选择数据。在我们的示例DataFrame中,我们提供了有意义的名称作为索引值。许多DataFrame没有任何有意义的名称,而是默认为从0到n-1的整数,其中n是DataFrame的长度(行数)。
你可以为.loc使用许多不同的输入,其中三个是
一个字符串
字符串列表
使用字符串作为开始值和停止值的切片表示法
选择带有.loc字符串的单行
要选择单行数据,请将索引标签放在.loc后面的括号内。
df.loc['Penelope']
这将以Series的形式返回数据行
age 4
color white
food Apple
height 80
score 3.3
state AL
Name: Penelope, dtype: object
使用.loc和字符串列表选择多行
df.loc[['Cornelia', 'Jane', 'Dean']]
返回一个DataFrame,按列表中指定的行顺序排列:
使用切片符号的.loc选择多行
切片表示法由开始值、停止值和步长值定义。当按标签切片时,pandas在返回值中包含停止值。以下是艾伦写给迪恩的片段,包括在内。它的步长没有明确定义,但默认为1。
df.loc['Aaron':'Dean']
复杂片可以以与Python列表相同的方式获取。
.iloc仅根据整数位置选择数据
现在让我们转向.iloc。DataFrame中的每一行和每一列数据都有一个定义它的整数位置。这是在输出中可视显示的标签之外。整数位置就是从上/左开始从0开始的行数/列数。
有许多不同的输入可以用于.iloc,其中三个是
一个整数
整数列表
使用整数作为开始值和停止值的切片表示法
选择带有整数的.iloc的单行
df.iloc[4]
这将返回第5行(整数位置4)作为一个Series
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同时选择行和列
两个.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_loc索引方法将索引标签转换为整数。
labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]
布尔选择
.loc索引器也可以进行布尔选择。例如,如果我们想找到年龄大于30岁的所有行,只返回食物和分数列,我们可以这样做:
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索引操作符的主要用途,即选择列。字符串选择单列作为Series,字符串列表选择多个列作为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和.iat选择
使用.at选择与.loc几乎相同,但它只选择DataFrame中的单个“单元格”。我们通常将此单元格称为标量值。要使用.at,向它传递行标签和列标签,以逗号分隔。
df.at['Christina', 'color']
'black'
使用.iat的选择与.iloc几乎相同,但它只选择单个标量值。必须为行和列的位置传递一个整数
df.iat[2, 5]
'FL'