pd.DataFrame.loc 可以带一个或两个索引器。在本文的其余部分,我将第一个索引器表示为i,将第二个索引器表示为j。
如果只提供一个索引器,它适用于数据框的索引,并且假定缺少的索引器代表所有列。所以下面两个例子是等价的。
df.loc[i]
df.loc[i, :]
其中: 用于表示所有列。
如果两个索引器都存在,i 引用索引值,j 引用列值。
现在我们可以关注i 和j 可以假设的值类型。让我们使用以下数据框df 作为我们的示例:
df = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'], columns=['X', 'Y'])
loc 已经写成 i 和 j 可以是
-
标量应该是各个索引对象中的值
df.loc['A', 'Y']
2
-
数组,其元素也是相应索引对象的成员(请注意,我传递给 loc 的数组的顺序受到尊重
df.loc[['B', 'A'], 'X']
B 3
A 1
Name: X, dtype: int64
-
在传递数组时注意返回对象的维度。 i 和上面一样是一个数组,loc 返回一个对象,其中返回具有这些值的索引。在这种情况下,因为j 是一个标量,所以loc 返回一个pd.Series 对象。如果我们为i 和j 传递一个数组,我们可以操纵它返回一个数据帧,而该数组可能只是一个单值数组。
df.loc[['B', 'A'], ['X']]
X
B 3
A 1
-
布尔数组,其元素为True 或False,并且其长度与相应索引的长度相匹配。在这种情况下,loc 只是抓取布尔数组为True 的行(或列)。
df.loc[[True, False], ['X']]
X
A 1
除了可以传递给loc 的索引器之外,它还使您能够进行分配。现在我们可以分解您提供的代码行了。
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
-
iris_data['class'] == 'versicolor' 返回一个布尔数组。
-
class 是一个标量,表示列对象中的值。
-
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] 返回一个 pd.Series 对象,该对象由 'class' 列组成,其中 'class' 是 'versicolor' 的所有行
-
与赋值运算符一起使用时:
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
我们为'class' 列中的所有元素分配'Iris-versicolor',其中'class' 是'versicolor'