Ответ 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'