在 python 中使用 .loc 选择
Selection with .loc in python
我在某人的 iPython 笔记本中看到了这段代码,我对这段代码的工作原理感到非常困惑。据我了解,pd.loc[] 用作基于位置的索引器,格式为:
df.loc[index,column_name]
但是,在这种情况下,第一个索引似乎是一系列布尔值。有人可以向我解释一下这个选择是如何工作的吗?我试图通读文档,但找不到解释。谢谢!
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
这是使用 pandas
包中的数据帧。 "index" 部分可以是单个索引、索引列表或布尔值列表。这可以在文档中阅读:https://pandas.pydata.org/pandas-docs/stable/indexing.html
因此 index
部分指定要提取的行的子集,并且(可选)column_name
指定要从数据帧的该子集中使用的列。因此,如果您想更新 'class' 列,但只更新 class 当前设置为 'versicolor' 的行,您可能会像问题中列出的那样执行操作:
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
它是 pandas
基于标签的选择,如此处解释:https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label
布尔数组基本上是一种使用掩码的选择方法。
pd.DataFrame.loc
可以带一个或两个索引器。对于 post 的其余部分,我将第一个索引器表示为 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
arrays 其元素也是相应索引对象的成员(注意我传递给 loc
的数组的顺序受到尊重
df.loc[['B', 'A'], 'X']
B 3
A 1
Name: X, dtype: int64
注意传递数组时return对象的维数。 i
是上面的数组,loc
returns 是一个对象,其中具有这些值的索引是 returned。在这种情况下,因为 j
是一个标量,所以 loc
return 编辑了一个 pd.Series
对象。如果我们为 i
和 j
传递数组,我们可以将其操作为 return 数据框,并且该数组可能只是一个单值数组。
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'
return 一个布尔数组。
class
是表示列对象中值的标量。
iris_data.loc[iris_data['class'] == 'versicolor', 'class']
returns 一个 pd.Series
对象,包含所有行的 'class'
列,其中 'class'
是 'versicolor'
与赋值运算符一起使用时:
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
我们为列 'class'
中的所有元素分配 'Iris-versicolor'
,其中 'class'
是 'versicolor'
这是一个 pandas 数据框,它使用带 df.loc
的标签库选择工具,其中有两个输入,一个用于行,另一个用于列,所以在行输入中,它选择所有那些行值,其中保存在列 class
中的值为 versicolor
,在列输入中,它选择带有标签 class
的列,并分配 Iris-versicolor
对他们的价值。
所以基本上它是用值 versicolor
和 Iris-versicolor
.
替换列 class
的所有单元格
每当 slicing (a:n
) can be used, it can be replaced by fancy indexing(例如 [a,b,c,...,n]
)。花哨的索引无非是明确列出所有索引值,而不是仅指定限制。
只要可以使用奇特的索引,就可以将其替换为与索引大小相同的布尔值列表(mask)。对于本应包含在花式索引中的索引值,该值为 True
,对于将被排除的值,该值为 False
。这是列出一些索引值的另一种方式,但可以在 NumPy 和 Pandas 中轻松实现自动化,例如通过逻辑比较(如您的情况)。
第二种替换可能性是您示例中使用的那个。在:
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
面具
iris_data['class'] == 'versicolor'
是一个冗长而愚蠢的奇特索引的替代品,它是行号列表,其中 class
列(一个系列)的值为 versicolor
.
布尔掩码是出现在 .iloc
或 .loc
(例如 df.loc[mask]
)索引器中还是直接作为索引(例如 df[mask]
)取决于切片允许作为直接索引。此类情况显示在以下索引器 cheat-sheet:
Pandas 索引器 loc 和 iloc 作弊-sheet
我在某人的 iPython 笔记本中看到了这段代码,我对这段代码的工作原理感到非常困惑。据我了解,pd.loc[] 用作基于位置的索引器,格式为:
df.loc[index,column_name]
但是,在这种情况下,第一个索引似乎是一系列布尔值。有人可以向我解释一下这个选择是如何工作的吗?我试图通读文档,但找不到解释。谢谢!
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
这是使用 pandas
包中的数据帧。 "index" 部分可以是单个索引、索引列表或布尔值列表。这可以在文档中阅读:https://pandas.pydata.org/pandas-docs/stable/indexing.html
因此 index
部分指定要提取的行的子集,并且(可选)column_name
指定要从数据帧的该子集中使用的列。因此,如果您想更新 'class' 列,但只更新 class 当前设置为 'versicolor' 的行,您可能会像问题中列出的那样执行操作:
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
它是 pandas
基于标签的选择,如此处解释:https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label
布尔数组基本上是一种使用掩码的选择方法。
pd.DataFrame.loc
可以带一个或两个索引器。对于 post 的其余部分,我将第一个索引器表示为 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
arrays 其元素也是相应索引对象的成员(注意我传递给
loc
的数组的顺序受到尊重df.loc[['B', 'A'], 'X'] B 3 A 1 Name: X, dtype: int64
注意传递数组时return对象的维数。
i
是上面的数组,loc
returns 是一个对象,其中具有这些值的索引是 returned。在这种情况下,因为j
是一个标量,所以loc
return 编辑了一个pd.Series
对象。如果我们为i
和j
传递数组,我们可以将其操作为 return 数据框,并且该数组可能只是一个单值数组。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'
return 一个布尔数组。class
是表示列对象中值的标量。iris_data.loc[iris_data['class'] == 'versicolor', 'class']
returns 一个pd.Series
对象,包含所有行的'class'
列,其中'class'
是'versicolor'
与赋值运算符一起使用时:
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
我们为列
'class'
中的所有元素分配'Iris-versicolor'
,其中'class'
是'versicolor'
这是一个 pandas 数据框,它使用带 df.loc
的标签库选择工具,其中有两个输入,一个用于行,另一个用于列,所以在行输入中,它选择所有那些行值,其中保存在列 class
中的值为 versicolor
,在列输入中,它选择带有标签 class
的列,并分配 Iris-versicolor
对他们的价值。
所以基本上它是用值 versicolor
和 Iris-versicolor
.
class
的所有单元格
每当 slicing (
a:n
) can be used, it can be replaced by fancy indexing(例如[a,b,c,...,n]
)。花哨的索引无非是明确列出所有索引值,而不是仅指定限制。只要可以使用奇特的索引,就可以将其替换为与索引大小相同的布尔值列表(mask)。对于本应包含在花式索引中的索引值,该值为
True
,对于将被排除的值,该值为False
。这是列出一些索引值的另一种方式,但可以在 NumPy 和 Pandas 中轻松实现自动化,例如通过逻辑比较(如您的情况)。
第二种替换可能性是您示例中使用的那个。在:
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
面具
iris_data['class'] == 'versicolor'
是一个冗长而愚蠢的奇特索引的替代品,它是行号列表,其中 class
列(一个系列)的值为 versicolor
.
布尔掩码是出现在 .iloc
或 .loc
(例如 df.loc[mask]
)索引器中还是直接作为索引(例如 df[mask]
)取决于切片允许作为直接索引。此类情况显示在以下索引器 cheat-sheet:
Pandas 索引器 loc 和 iloc 作弊-sheet