在python中使用.loc进行选择

bug*_*syb 38 python selection ipython dataframe pandas

我在某人的iPython笔记本中看到了这段代码,我对此代码的工作原理感到非常困惑.据我所知,pd.loc []用作基于位置的索引器,其格式为:

df.loc[index,column_name]
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,第一个索引似乎是一系列布尔值.有人可以向我解释这个选择是如何运作的.我试着阅读文档,但我无法找出解释.谢谢!

iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

piR*_*red 74

pd.DataFrame.loc可以带一个或两个索引器.对于帖子的其余部分,我将代表第一个索引器i和第二个索引器j.

如果只提供了一个索引器,它将应用于数据帧的索引,并且假定丢失的索引器代表所有列.所以以下两个例子是等价的.

  1. df.loc[i]
  2. df.loc[i, :]

:被用来代表所有列.

如果两个索引器都存在,则i引用索引值和j引用列值.


现在我们可以专注于什么类型的价值,ij可以假设.我们使用以下数据帧df作为示例:

    df = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'], columns=['X', 'Y'])
Run Code Online (Sandbox Code Playgroud)

loc已被写入,使得ij

  1. 标量应该是相应索引对象中的值

    df.loc['A', 'Y']
    
    2
    
    Run Code Online (Sandbox Code Playgroud)
  2. 其元素也是相应索引对象的成员的数组(注意,我传递给的数组的顺序loc是受到尊重的

    df.loc[['B', 'A'], 'X']
    
    B    3
    A    1
    Name: X, dtype: int64
    
    Run Code Online (Sandbox Code Playgroud)
    • 注意传递数组时返回对象的维度. i是一个如上所示的数组,loc返回一个对象,其中返回具有这些值的索引.在这种情况下,因为j是标量,loc返回一个pd.Series对象.如果我们为iand 传递一个数组,我们可以操纵它来返回一个数据帧j,并且数组可能只是一个单值数组.

      df.loc[['B', 'A'], ['X']]
      
         X
      B  3
      A  1
      
      Run Code Online (Sandbox Code Playgroud)
  3. 布尔数组,其元素是True或者False其长度与相应索引的长度相匹配.在这种情况下,loc只需抓取布尔数组所在的行(或列)True.

    df.loc[[True, False], ['X']]
    
       X
    A  1
    
    Run Code Online (Sandbox Code Playgroud)

除了可以传递给哪些索引器之外loc,它还允许您进行分配.现在我们可以细分您提供的代码行.

iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
Run Code Online (Sandbox Code Playgroud)
  1. iris_data['class'] == 'versicolor' 返回一个布尔数组.
  2. class 是一个标量,表示列对象中的值.
  3. iris_data.loc[iris_data['class'] == 'versicolor', 'class']返回一个pd.Series对象组成的的'class'列的所有行'class''versicolor'
  4. 与赋值运算符一起使用时:

    iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
    
    Run Code Online (Sandbox Code Playgroud)

    我们分配'Iris-versicolor'在列中的所有元素'class',其中'class''versicolor'


Lan*_*are 6

这是使用pandas包中的数据帧。“索引”部分可以是单个索引,索引列表或布尔值列表。可以在文档中阅读:https : //pandas.pydata.org/pandas-docs/stable/indexing.html

因此,该index部分指定了要拉出的行的子集,(可选)column_name指定了要从该数据帧的子集中使用的列。因此,如果要更新“类”列,但仅在当前将类设置为“ versicolor”的行中进行更新,则可以执行类似在问题中列出的操作:

iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
Run Code Online (Sandbox Code Playgroud)