在python中使用.loc进行选择

时间:2017-07-03 16:57:09

标签: python pandas dataframe ipython selection

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

iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'

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

targetTags

enter image description here

5 个答案:

答案 0 :(得分:63)

pd.DataFrame.loc可以使用一个或两个索引器。对于帖子的其余部分,我将第一个索引器表示为i,将第二个索引器表示为j

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

  1. df.loc[i]
  2. df.loc[i, :]
  3. 其中:用于表示所有列。

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

    现在我们可以专注于ij可以假设的值类型。我们使用以下数据框df作为示例:

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

    loc已经写成ij可以

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

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

      df.loc[['B', 'A'], 'X']
      
      B    3
      A    1
      Name: X, dtype: int64
      
      • 注意传递数组时返回对象的维度。 i是上面的数组,loc返回一个对象,其中返回包含这些值的索引。在这种情况下,由于j是标量,loc返回了pd.Series个对象。如果我们传递ij的数组,我们可以操纵它来返回数据帧,并且数组可能只是一个单值数组。

        df.loc[['B', 'A'], ['X']]
        
           X
        B  3
        A  1
        
    3. 布尔数组,其元素为TrueFalse,其长度与相应索引的长度相匹配。在这种情况下,loc只是抓取布尔数组为True的行(或列)。

      df.loc[[True, False], ['X']]
      
         X
      A  1
      
    4. 除了可以传递给loc的索引器之外,它还可以让您进行分配。现在我们可以细分您提供的代码行。

      iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
      
      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'
      5. 与赋值运算符一起使用时:

        'Iris-versicolor'

        我们为'class' 'class''versicolor'

      6. 的列CheckboxPicture.CheckedChanged += CheckboxPicture_CheckedChanged 中的所有元素分配CheckboxPicture_CheckedChanged()

答案 1 :(得分:3)

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

因此index部分指定要提取的行的子集,而(可选)column_name指定要从数据帧的该子集处理的列。因此,如果您想要更新“类”列,但仅限于当前类设置为“versicolor”的行,您可能会执行类似于您在问题中列出的内容:

iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'

答案 2 :(得分:3)

它是一个pandas数据框架,它使用带有df.loc的标签库选择工具,其中有两个输入,一个用于行,另一个用于列,所以在行输入它选择所有那些行值,其中值保存在列'类'是' versicolor',在列输入中,它选择带有标签' class'的列。 ,并分配' Iris-versicolor'对他们有价值。 所以基本上它取代了所有列的单元格' class'有价值的' versicolor'用' Iris-versicolor'。

答案 3 :(得分:1)

  1. 每当可以使用 slicing (a:n) 时,都可以将其替换为 fancy indexing(例如 [a,b,c,...,n])。花式索引无非是明确列出所有索引值,而不是仅指定限制。

  2. 每当可以使用花哨的索引时,它都可以替换为与索引大小相同的布尔值列表(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])取决于是否允许切片作为直接索引。此类情况显示在以下索引器备忘单中:

Pandas indexers loc and iloc cheat-sheet
Pandas 索引器 loc 和 iloc 备忘单

答案 4 :(得分:0)

这是pandas基于标签的选择,如下所述:https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label

布尔数组基本上是一个使用掩码的选择方法。