#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
.
Если указан только один индексатор, он применяется к индексу фрейма данных, и предполагается, что отсутствующий индексатор представляет все столбцы. Таким образом, следующие два примера эквивалентны.
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
andj
, и массив мог бы быть просто массивом с одним значением.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
и в нем есть два ввода, один для строки, а другой для столбца, поэтому при вводе строки он выбирает все те значения строк, где находится значение, сохраненное в столбце class
versicolor
, и вввод столбца — это выбор столбца с меткой class
и присвоение Iris-versicolor
им значения. Таким образом, в основном это замена всех ячеек столбца class
значением versicolor
Iris-versicolor
.
Ответ №4:
- Всякий раз, когда можно использовать slicing (
a:n
), его можно заменить причудливой индексацией (например[a,b,c,...,n]
). Причудливое индексирование — это не что иное, как явное перечисление всех значений индекса вместо указания только ограничений. - Всякий раз, когда можно использовать причудливую индексацию, ее можно заменить списком логических значений (маской) того же размера, что и индекс. Значение будет
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]
), зависит от того, разрешен ли фрагмент в качестве прямого индекса. Такие случаи показаны в следующей шпаргалке для индексатора:
Ответ №5:
Это pandas
выбор на основе меток, как объясняется здесь: https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label
Логический массив — это, по сути, метод выделения с использованием маски.