Выбор с .loc в python

Я видел этот код у кого-то iPython-ноутбука, и я очень смущен тем, как работает этот код. Насколько я понял, pd.loc [] используется в качестве индексатора, основанного на местоположении, где формат:

df.loc[index,column_name]

Однако в этом случае первый индекс, по-видимому, представляет собой ряд булевых значений. Может кто-нибудь, пожалуйста, объясните мне, как работает этот выбор. Я попытался прочитать документацию, но я не мог понять объяснения. Спасибо!

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

введите описание изображения здесь

Ответ 1

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 - это скаляр, который представляет значение в объекте columns.
  • iris_data.loc[iris_data['class'] == 'versicolor', 'class'] возвращает объект pd.Series, состоящий из столбца 'class' для всех строк, где 'class' есть 'versicolor'
  • При использовании с оператором присваивания:

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

    Мы назначаем 'Iris-versicolor' для всех элементов в столбце 'class', где 'class' был 'versicolor'

Ответ 2

Это использует данные из пакета pandas. Часть "index" может быть либо одним индексом, либо индексом, либо списком логических элементов. Это можно прочитать в документации: https://pandas.pydata.org/pandas-docs/stable/indexing.html

Итак, часть index указывает подмножество строк для вывода, а (необязательный) column_name указывает столбец, с которым вы хотите работать, из этого подмножества в кадре данных. Поэтому, если вы хотите обновить столбец "class", но только в строках, где в настоящее время класс задан как "versicolor", вы можете сделать что-то вроде того, что вы перечисляете в вопросе:

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

Ответ 3

Это кадр данных pandas, и он использует инструмент выбора метки для метки с df.loc и в нем есть два входа: один для строки и другой для столбца, поэтому в строке ввода он выбирает все те значения строк, в которых значение, сохраненное в столбце "класс" , является "versicolor", а в столбце ввода он выбирает столбец с меткой "класс" и присваивает им значение "Iris-versicolor". Таким образом, в основном он заменяет все ячейки класса "класс" значением "versicolor" на "Iris-versicolor".