Недавно начал переходить из моего безопасного места (R) в Python, и меня немного смущает локализация / выборка ячеек в Pandas
. Я прочитал документацию, но изо всех сил пытаюсь понять практические последствия различных вариантов локализации / выбора.
- Есть ли причина , почему я никогда не должен использовать
.loc
или.iloc
по наиболее общем вариант.ix
? - Я понимаю , что
.loc
,iloc
,at
, иiat
может обеспечить определенную гарантию правильности , что.ix
не может предложить, но я также читал, как.ix
правило, является самым быстрым решением по всем направлениям. - Пожалуйста, объясните реальную практическую причину использования чего-либо, кроме
.ix
?
loc
индексирование на основе меток, поэтому в основном выполняется поиск значения в строке;iloc
индексация на основе целочисленных строк;ix
это общий метод, который вначале выполняет основанную на метках метку, в случае неудачи он переходит к целочисленной.at
устарела, и рекомендуется не использовать его больше. Другая вещь, которую следует учитывать, - это то, что вы пытаетесь сделать, так как некоторые из этих методов позволяют нарезать и назначать столбцы, если честно, документы довольно ясны: pandas.pydata.org/pandas-docs/stable/indexing.htmlat
это устарело? Я не вижу этого в документах at (или iat ).loc
,ix
иiloc
здесь: stackoverflow.com/questions/31593201/...Ответы:
loc: работать только с индексом
iloc: работать с позицией
ix: Вы можете получать данные из фрейма данных без их нахождения в индексе по
адресу: получить скалярные значения. Это очень быстрое
определение: получить скалярные значения. Это очень быстрый iloc
http://pyciencia.blogspot.com/2015/05/obtener-y-filtrar-datos-de-un-dataframe.html
Примечание. По состоянию
pandas 0.20.0
на данный момент.ix
индексатор устарел в пользу более строгих.iloc
и.loc
индексаторов.источник
at
иiat
являются очень быстрыми версиямиloc
иiloc
, то зачем использоватьloc
иiloc
вообще?at
иiat
предназначенный для доступа к скаляру, то есть к единственному элементу в кадре данных, в то же времяloc
иiloc
для доступа к нескольким элементам одновременно, потенциально для выполнения векторизованных операций.Обновлено для
pandas
0.20
данного, чтоix
устарело. Это свидетельствует не только то, как использоватьloc
,iloc
,at
,iat
,set_value
, но как добиться, смешанной индексации на основе позиционных / метки.loc
- на основе метокПозволяет передавать одномерные массивы в качестве индексаторов. Массивы могут быть либо срезами (подмножествами) индекса или столбца, либо они могут быть логическими массивами, длина которых равна индексу или столбцам.
Специальное примечание: при передаче скалярного индексатора
loc
можно назначить новый индекс или значение столбца, которого раньше не было.iloc
- на основе позицииАналогично тому,
loc
за исключением позиций, а не значений индекса. Однако вы не можете назначать новые столбцы или индексы.at
- этикетка на основепроизведения очень похоже на
loc
скалярные индексатор. Не может работать с индексаторами массива. Жестяная банка! назначить новые индексы и столбцы.Преимущество в
loc
том, что это быстрее.Недостатком является то, что вы не можете использовать массивы для индексаторов.
iat
- Позиция на основеработает аналогично
iloc
. Не может работать в индексаторах массива. Не может! назначить новые индексы и столбцы.Преимущество в
iloc
том, что это быстрее.Недостатком является то, что вы не можете использовать массивы для индексаторов.
set_value
- этикетка на основепроизведения очень похоже на
loc
скалярные индексатор. Не может работать с индексаторами массива. Жестяная банка! назначить новые индексы и столбцыПреимущество Super fast, потому что накладных расходов очень мало!
Недостаток Очень мало накладных расходов, потому что
pandas
не выполняется куча проверок безопасности. Используйте на свой страх и риск . Кроме того, это не предназначено для общественного использования.set_value
сtakable=True
- позиция на основеработает аналогично
iloc
. Не может работать в индексаторах массива. Не может! назначить новые индексы и столбцы.Преимущество Super fast, потому что накладных расходов очень мало!
Недостаток Очень мало накладных расходов, потому что
pandas
не выполняется куча проверок безопасности. Используйте на свой страх и риск . Кроме того, это не предназначено для общественного использования.источник
set_value
является устаревшим в пользу.at
и ,.iat
начиная с версии 0,21Есть два основных способа, которыми pandas делает выбор из DataFrame.
В документации термин « позиция» используется для обозначения целочисленного местоположения . Мне не нравится эта терминология, поскольку я чувствую, что она сбивает с толку. Целочисленное расположение более наглядно и является именно тем, что
.iloc
обозначает. Ключевое слово здесь - INTEGER - вы должны использовать целые числа при выборе по целому расположению.Прежде чем показывать резюме, давайте убедимся, что ...
.ix устарела и неоднозначна и никогда не должна использоваться
Есть три основных индекса для панд. У нас есть сам оператор индексации (скобки
[]
).loc
, и.iloc
. Давайте подведем их итоги:[]
- В первую очередь выбирает подмножества столбцов, но также может выбирать строки. Невозможно одновременно выбрать строки и столбцы..loc
- выбирает подмножества строк и столбцов только по меткам.iloc
- выбирает подмножества строк и столбцов только целочисленным расположениемЯ почти никогда не пользуюсь
.at
или так.iat
как они не добавляют никакой дополнительной функциональности и лишь с небольшим увеличением производительности. Я бы не рекомендовал их использовать, если у вас нет очень чувствительного ко времени приложения. Несмотря на это, у нас есть их резюме:.at
выбирает одно скалярное значение в DataFrame только по метке.iat
выбирает одно скалярное значение в DataFrame только по целочисленному расположениюВ дополнение к выбору по метке и целочисленному местоположению существует логическое выделение, также известное как логическое индексирование .
Примеры, поясняющие
.loc
,.iloc
булево выделение и.at
и.iat
показаны нижеСначала мы сосредоточимся на различиях между
.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
выбора строк очень предпочтительна. Один оператор индексирования не может одновременно выбирать строки и столбцы.Выбор по
.at
и.iat
Выбор с
.at
почти идентичен,.loc
но он выбирает только одну «ячейку» в вашем DataFrame. Мы обычно называем эту ячейку скалярным значением. Чтобы использовать.at
, передайте и метку строки и столбца через запятую.Выбор с
.iat
почти идентичен,.iloc
но он выбирает только одно скалярное значение. Вы должны передать ему целое число как для строк, так и для столбцовисточник
источник
Давайте начнем с этого небольшого df:
У нас так будет
С этим мы имеем:
Таким образом, мы не можем использовать .iat для подмножества, где мы должны использовать только .iloc.
Но давайте попробуем оба выбрать больший df и проверим скорость ...
Таким образом, с помощью .loc мы можем управлять подмножествами, а с помощью .at - только одним скаляром, но .at быстрее, чем .loc.
:-)
источник