Выделение с помощью .loc в python

#python #pandas #data-science

#python #pandas #фрейм данных #ipython #выделение

Вопрос:

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

 df.loc[index,column_name]
 

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

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

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

Ответ №1:

pd.DataFrame.loc может принимать один или два индексатора. В остальной части сообщения я буду представлять первый индексатор как i , а второй индексатор как j .

Если указан только один индексатор, он применяется к индексу фрейма данных, и предполагается, что отсутствующий индексатор представляет все столбцы. Таким образом, следующие два примера эквивалентны.

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

Где : используется для представления всех столбцов.

Если присутствуют оба индексатора, i ссылаются на значения индекса и j ссылаются на значения столбцов.


Теперь мы можем сосредоточиться на том, какие типы значений i и j могут предполагать. Давайте используем следующий df фрейм данных в качестве нашего примера:

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

loc было написано так, что i и j может быть

  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 объект. Мы могли бы манипулировать этим, чтобы вернуть фрейм данных, если бы мы передали массив для i and j , и массив мог бы быть просто массивом с одним значением.
       df.loc[['B', 'A'], ['X']]
      
         X
      B  3
      A  1
       
  3. логические массивы, элементами которых являются True или False и длина которых соответствует длине соответствующего индекса. В этом случае loc просто захватывает строки (или столбцы), в которых находится логический массив True .
     df.loc[[True, False], ['X']]
    
       X
    A  1
     

В дополнение к тому, к каким индексаторам вы можете перейти loc , это также позволяет вам назначать назначения. Теперь мы можем разбить строку кода, которую вы предоставили.

 iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
 
  1. iris_data['class'] == 'versicolor' возвращает логический массив.
  2. class является скаляром, который представляет значение в объекте columns .
  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'
     

    Мы назначаем '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 и в нем есть два ввода, один для строки, а другой для столбца, поэтому при вводе строки он выбирает все те значения строк, где находится значение, сохраненное в столбце class versicolor , и вввод столбца — это выбор столбца с меткой class и присвоение Iris-versicolor им значения. Таким образом, в основном это замена всех ячеек столбца class значением versicolor Iris-versicolor .

Ответ №4:

  1. Всякий раз, когда можно использовать slicing ( a:n ), его можно заменить причудливой индексацией (например [a,b,c,...,n] ). Причудливое индексирование — это не что иное, как явное перечисление всех значений индекса вместо указания только ограничений.
  2. Всякий раз, когда можно использовать причудливую индексацию, ее можно заменить списком логических значений (маской) того же размера, что и индекс. Значение будет True для значений индекса, которые были бы включены в fancy index, и False для значений, которые были бы исключены. Это еще один способ перечисления некоторых значений индекса, но который можно легко автоматизировать в NumPy и Pandas, например, путем логического сравнения (как в вашем случае).

Вторая возможность замены — это та, которая используется в вашем примере. В:

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

маска

 iris_data['class'] == 'versicolor'
 

это замена длинного и глупого причудливого индекса, который будет представлять собой список номеров строк, где class столбец (серия) имеет значение versicolor .

Отображается ли логическая маска в индексаторе .iloc or .loc (например df.loc[mask] ) или непосредственно в качестве индекса (например df[mask] ), зависит от того, разрешен ли фрагмент в качестве прямого индекса. Такие случаи показаны в следующей шпаргалке для индексатора:

Pandas индексирует loc и шпаргалку iloc
Pandas индексирует loc и шпаргалку iloc

Ответ №5:

Это pandas выбор на основе меток, как объясняется здесь: https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label

Логический массив — это, по сути, метод выделения с использованием маски.