Может кто-нибудь объяснить, чем эти три метода нарезки отличаются?
Я видел документы , и я видел эти ответы , но я все еще не могу объяснить, чем они отличаются. Мне они кажутся взаимозаменяемыми в значительной степени, потому что они находятся на более низких уровнях нарезки.
Например, скажем, мы хотим получить первые пять строк DataFrame
. Как получается, что все три из них работают?
df.loc[:5]
df.ix[:5]
df.iloc[:5]
Может ли кто-нибудь представить три случая, когда различие в использовании яснее?
Ответы:
Примечание: в панд версии 0.20.0 и выше,
ix
является устаревшим и использованиеloc
иiloc
рекомендуется вместо этого. Я оставил части этого ответа, которые описываютix
нетронутыми, как ссылку для пользователей более ранних версий панд. Ниже были добавлены примеры, показывающие альтернативыix
.Во-первых, вот резюме трех методов:
loc
получает строки (или столбцы) с определенными метками из индекса.iloc
получает строки (или столбцы) в определенных позициях в индексе (поэтому он принимает только целые числа).ix
обычно пытается вести себя как,loc
но возвращается к поведению, какiloc
будто метка отсутствует в индексе.Важно отметить некоторые тонкости, которые могут быть
ix
немного хитрыми в использовании:если индекс имеет целочисленный тип, он
ix
будет использовать только индексирование на основе меток и не будет возвращаться к индексации на основе позиций. Если метка отсутствует в индексе, возникает ошибка.если индекс не содержит только целых чисел, то при наличии целого числа
ix
немедленно будет использоваться индексация на основе позиции, а не индексация на основе меток. Однако еслиix
указан другой тип (например, строка), он может использовать индексирование на основе меток.Чтобы проиллюстрировать различия между тремя методами, рассмотрим следующую серию:
Мы рассмотрим нарезку с целочисленным значением
3
.В этом случае
s.iloc[:3]
возвращает нам первые 3 строки (поскольку он обрабатывает 3 как позицию) иs.loc[:3]
возвращает нам первые 8 строк (поскольку он обрабатывает 3 как метку):Notice
s.ix[:3]
возвращает ту же серию, что и,s.loc[:3]
поскольку она сначала ищет метку, а не работает над позицией (а индекс дляs
имеет целочисленный тип).Что если мы попробуем с целочисленной меткой, которой нет в индексе (скажем
6
)?Здесь
s.iloc[:6]
возвращает первые 6 строк Серии, как и ожидалось. Однакоs.loc[:6]
вызывает KeyError, поскольку6
отсутствует в индексе.В соответствии с тонкостями, указанными выше,
s.ix[:6]
теперь возникает KeyError, потому что он пытается работать как,loc
но не может найти6
в индексе. Поскольку наш индекс имеет целочисленный тип,ix
он не ведет себя какiloc
.Однако, если бы наш индекс имел смешанный тип, данное целое число
ix
будет вести себя какiloc
сразу, а не вызывать KeyError:Имейте в виду, что
ix
все еще может принимать нецелые и вести себя какloc
:В качестве общего совета, если вы индексируете только по меткам или индексируете только по целочисленным позициям, придерживайтесь
loc
или,iloc
чтобы избежать неожиданных результатов - старайтесь не использоватьix
.Объединение индексации на основе позиции и метки
Иногда, учитывая DataFrame, вы захотите смешать метки и методы позиционной индексации для строк и столбцов.
Например, рассмотрим следующий DataFrame. Как лучше всего нарезать строки до 'c' включительно и взять первые четыре столбца?
В более ранних версиях pandas (до 0.20.0)
ix
вы можете делать это довольно аккуратно - мы можем нарезать строки по меткам и столбцы по позициям (обратите внимание, что для столбцов поix
умолчанию будет нарезка по позициям, поскольку4
это не имя столбца ):В более поздних версиях панд мы можем достичь этого результата, используя
iloc
и другой метод:get_loc()
это метод индекса, означающий «получить позицию метки в этом индексе». Обратите внимание, что, так как нарезка сiloc
исключает его конечную точку, мы должны добавить 1 к этому значению, если нам также нужна строка 'c'.Есть другие примеры в документации панд здесь .
источник
loc
,iloc
иix
все еще может вызвать предупреждение , если они соединены друг с другом. Использование примера DataFrame в связанных документахdfmi.loc[:, 'one'].loc[:, 'second']
вызывает предупреждение, какdfmi['one']['second']
если бы первая операция индексирования могла вернуть копию данных (а не представление).df.ix[date, 'Cash']
?loc
илиix
должны работать в этом случае. Например,df.loc['2016-04-29', 'Cash']
вернет все индексы строк с этой конкретной датой из столбца «Наличные». (Вы можете указать столько, сколько хотите, при извлечении индексов со строками, например'2016-01'
, выберете все даты, приходящиеся на январь 2016 года, `'2016-01-02 11' выберет даты и времени 2 января 2016 года со временем 11: ??: ?? .)iloc
работает на основе целочисленного позиционирования. Поэтому независимо от того, какие у вас метки строк, вы всегда можете, например, получить первый ряд, выполнивили последние пять строк, выполнив
Вы также можете использовать его на столбцах. Это возвращает 3-й столбец:
Вы можете объединить их, чтобы получить пересечения строк и столбцов:
С другой стороны,
.loc
используйте именованные индексы. Давайте настроим фрейм данных со строками в виде меток строк и столбцов:Тогда мы можем получить первый ряд
а вторые две строки
'date'
столбцаи так далее. Теперь, это, вероятно , стоит отметить, что в строке по умолчанию и индексы столбцов для
DataFrame
целых чисел от 0 и в этом случаеiloc
иloc
будет работать таким же образом. Вот почему ваши три примера эквивалентны. Если бы у вас был нечисловой индекс, такой как строки или дата,df.loc[:5]
возникла бы ошибка.Кроме того, вы можете выполнять поиск столбцов, используя фреймы данных
__getitem__
:Теперь предположим, что вы хотите смешать индексирование позиций и имен, то есть индексирование с использованием имен в строках и позиций в столбцах (чтобы уточнить, я имею в виду выбор из нашего фрейма данных, а не создание фрейма данных со строками в индексе строк и целыми числами в индекс столбца). Вот где
.ix
приходит:Я также думаю, что стоит упомянуть, что вы также можете передавать булевы векторы в
loc
метод. Например:Вернет 1-й и 3-й ряды
df
. Это эквивалентноdf[b]
для выбора, но также может использоваться для присваивания через логические векторы:источник
df.loc[:, :]
. Он может быть использован для переназначения значений всегоDataFrame
или создания его представления.На мой взгляд, принятый ответ сбивает с толку, поскольку он использует DataFrame только с пропущенными значениями. Мне также не нравится термин, основанный на позиции,
.iloc
и вместо этого я предпочитаю целочисленное местоположение, так как оно гораздо более наглядно и именно то, что.iloc
обозначает. Ключевое слово INTEGER -.iloc
нужно INTEGERS.Смотрите мою чрезвычайно подробную серию блогов по выбору подмножества для более
.ix устарела и неоднозначна и никогда не должна использоваться
Потому
.ix
что устарела, мы сосредоточимся только на различиях между.loc
и.iloc
.Прежде чем говорить о различиях, важно понять, что в фреймах данных есть метки, которые помогают идентифицировать каждый столбец и каждый индекс. Давайте посмотрим на пример DataFrame:
Все слова, выделенные жирным шрифтом, являются метками. Этикетки,
age
,color
,food
,height
,score
иstate
используются для столбцов . Другие этикетки,Jane
,Nick
,Aaron
,Penelope
,Dean
,Christina
,Cornelia
используются для индекса .Основные способы выбора конкретных строк в DataFrame являются с
.loc
и.iloc
индексаторами. Каждый из этих индексаторов также можно использовать для одновременного выбора столбцов, но сейчас проще просто сосредоточиться на строках. Кроме того, каждый из индексаторов использует набор скобок, которые следуют сразу за их именем, чтобы сделать свой выбор..loc выбирает данные только по меткам
Сначала поговорим об
.loc
индексаторе, который выбирает данные только по меткам индекса или столбца. В нашем примере DataFrame мы предоставили значимые имена в качестве значений для индекса. Многие DataFrames не будут иметь каких-либо значимых имен и вместо этого по умолчанию будут просто целые числа от 0 до n-1, где n - длина DataFrame.Есть три различных входа, которые вы можете использовать для
.loc
Выбор одной строки с помощью .loc со строкой
Чтобы выбрать одну строку данных, поместите метку индекса внутри следующих квадратных скобок
.loc
.Это возвращает строку данных в виде серии
Выбор нескольких строк с помощью .loc со списком строк
Это возвращает DataFrame со строками в порядке, указанном в списке:
Выбор нескольких строк с помощью .loc с обозначением слайса
Обозначение среза определяется значениями start, stop и step. При разрезании по метке pandas включает в себя значение остановки в возвращаемом значении Следующие кусочки от Аарона до Дина включительно. Размер шага явно не определен, но по умолчанию равен 1.
Сложные фрагменты могут быть взяты так же, как списки Python.
.iloc выбирает данные только по целому расположению
Давайте теперь обратимся к
.iloc
. Каждая строка и столбец данных в DataFrame имеет целочисленное местоположение, которое определяет его. Это в дополнение к метке, которая визуально отображается в выходных данных . Целочисленное местоположение - это просто число строк / столбцов сверху / слева, начиная с 0.Есть три различных входа, которые вы можете использовать для
.iloc
Выбор одной строки с .iloc с целым числом
Это возвращает 5-ую строку (целочисленное расположение 4) как серию
Выбор нескольких строк с .iloc со списком целых чисел
Это возвращает DataFrame третьей и второй до последней строки:
Выбор нескольких строк с помощью .iloc с обозначением среза
Одновременный выбор строк и столбцов с .loc и .iloc
Одной из отличных способностей обоих
.loc/.iloc
является их способность выбирать строки и столбцы одновременно. В приведенных выше примерах все столбцы возвращались из каждого выбора. Мы можем выбрать столбцы с теми же типами входов, что и для строк. Нам просто нужно разделить выбор строки и столбца запятой .Например, мы можем выбрать строки Джейн и Дина только с высотой, счетом и состоянием столбцов следующим образом:
При этом используется список меток для строк и нотации для столбцов
Естественно, мы можем делать подобные операции,
.iloc
используя только целые числа.Одновременный выбор с метками и целочисленным расположением
.ix
был использован для выбора одновременно с метками и целочисленным местоположением, что было полезно, но иногда сбивало с толку и неоднозначно, и, к счастью, это устарело. В случае, если вам нужно сделать выборку с сочетанием меток и целочисленных местоположений, вы должны будете сделать как метки выбора, так и целочисленные местоположения.Например, если мы хотим выбрать строки
Nick
иCornelia
вместе со столбцами 2 и 4, мы можем использовать.loc
преобразование целых чисел в метки со следующим:Или, в качестве альтернативы, преобразуйте метки индекса в целые числа с помощью
get_loc
метода index.Логическое выделение
Индексатор .loc также может выполнять логический выбор. Например, если мы заинтересованы в поиске всех строк порога возраст выше 30 и возвращать только
food
иscore
столбцы , мы можем сделать следующее:Вы можете повторить это с,
.iloc
но вы не можете передать это логический ряд. Вы должны преобразовать логическую серию в массив numpy следующим образом:Выбор всех строк
Можно использовать
.loc/.iloc
только для выбора столбца. Вы можете выбрать все строки, используя двоеточие, как это:Оператор индексирования также
[]
может выбирать строки и столбцы, но не одновременно.Большинству людей знакомо основное назначение оператора индексации DataFrame - выбор столбцов. Строка выбирает один столбец в качестве Серии, а список строк выбирает несколько столбцов в качестве DataFrame.
Использование списка выбирает несколько столбцов
Люди менее знакомы с тем, что при использовании обозначения среза выбор происходит по меткам строк или по целочисленным местоположениям. Это очень сбивает с толку и то, что я почти никогда не использую, но это работает.
Явность
.loc/.iloc
выбора строк очень предпочтительна. Один оператор индексирования не может выбирать строки и столбцы одновременно.источник