IndexOutOfBoundsException -1 при использовании charAt () [duplicate]

Примечание: в версии pandas 0.20.0 и выше ix является устаревшим , и вместо этого рекомендуется использовать loc и iloc. Я оставил части этого ответа, которые описывают ix в качестве ссылки для пользователей более ранних версий панд. Примеры были добавлены ниже, показывая альтернативы ix .


Сначала рассмотрим три метода:

  • loc получает строки (или столбцы) с конкретными метками из индекса.
  • iloc получает строки (или столбцы) в определенных положениях в индексе (поэтому он принимает только целые числа).
  • ix обычно пытается например, loc, но возвращается к тому, чтобы вести себя как iloc, если метка отсутствует в индексе.

Важно отметить некоторые тонкости, которые могут сделать ix немного сложнее use:

  • , если индекс имеет целочисленный тип, ix будет использовать индексирование на основе меток и не возвращаться к индексированию на основе позиции. Если метка не указана в индексе, возникает ошибка.
  • , если индекс не содержит целых чисел только , а затем задает целое число, ix немедленно будет использовать позицию- а не индексации на основе меток. Если, однако, ix задан другой тип (например, строка), он может использовать индексирование на основе меток.

Чтобы проиллюстрировать различия между тремя методами, рассмотрим следующую серию :

>>> s = pd.Series(np.nan, index=[49,48,47,46,45, 1, 2, 3, 4, 5])
>>> s
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN
2    NaN
3    NaN
4    NaN
5    NaN

Мы рассмотрим срез с целым значением 3.

В этом случае s.iloc[:3] возвращает нам первые 3 строки (так как он обрабатывает 3 как позиция), а s.loc[:3] возвращает нам первые 8 строк (так как он рассматривает 3 как метку):

>>> s.iloc[:3] # slice the first three rows
49   NaN
48   NaN
47   NaN

>>> s.loc[:3] # slice up to and including label 3
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN
2    NaN
3    NaN

>>> s.ix[:3] # the integer is in the index so s.ix[:3] works like loc
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN
2    NaN
3    NaN

Уведомление s.ix[:3] возвращает ту же серию, что и s.loc[:3], поскольку она ищет метка сначала, а не работа над позицией (и индекс для s имеет целочисленный тип).

Что делать, если мы попытаемся использовать целую метку, которая не находится в индексе (скажем, 6 )?

Здесь s.iloc[:6] возвращает первые 6 строк Серии, как ожидалось. Однако s.loc[:6] вызывает KeyError, поскольку 6 не находится в индексе.

>>> s.iloc[:6]
49   NaN
48   NaN
47   NaN
46   NaN
45   NaN
1    NaN

>>> s.loc[:6]
KeyError: 6

>>> s.ix[:6]
KeyError: 6

В соответствии с отмеченными выше тонкостями s.ix[:6] теперь вызывает KeyError, потому что он пытается работать как loc, но не может найти 6 в индексе. Поскольку наш индекс имеет целочисленный тип ix, он не возвращается к поведению, как iloc.

Если, однако, наш индекс был смешанного типа, то целое число ix будет вести себя как iloc немедленно, вместо того, чтобы поднимать KeyError:

>>> s2 = pd.Series(np.nan, index=['a','b','c','d','e', 1, 2, 3, 4, 5])
>>> s2.index.is_mixed() # index is mix of different types
True
>>> s2.ix[:6] # now behaves like iloc given integer
a   NaN
b   NaN
c   NaN
d   NaN
e   NaN
1   NaN

Имейте в виду, что ix все еще могут принимать нецелые числа и вести себя как loc:

>>> s2.ix[:'c'] # behaves like loc given non-integer
a   NaN
b   NaN
c   NaN

As общие рекомендации, если вы используете только индексирование с использованием меток или только индексирование с использованием целых позиций, придерживайтесь loc или iloc, чтобы избежать неожиданных результатов. Не пытайтесь использовать ix.


Комбинирование индексирования на основе позиции и метки на основе меток

Иногда, учитывая DataFrame, вы хотите использовать методы меток меток и позиционных индексов для строк и столбцов.

Например, рассмотрим следующие DataFrame. Как лучше всего разрезать строки до и включая «c» и взять первые четыре столбца?

>>> df = pd.DataFrame(np.nan, 
                      index=list('abcde'),
                      columns=['x','y','z', 8, 9])
>>> df
    x   y   z   8   9
a NaN NaN NaN NaN NaN
b NaN NaN NaN NaN NaN
c NaN NaN NaN NaN NaN
d NaN NaN NaN NaN NaN
e NaN NaN NaN NaN NaN

В более ранних версиях панд (до 0.20.0) ix позволяет сделать это довольно аккуратно - мы можем нарезать строки по метке и столбцам по положению (обратите внимание, что для столбцов ix по умолчанию будет использоваться резка на основе положения, поскольку 4 не является именем столбца):

>>> df.ix[:'c', :4]
    x   y   z   8
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN

В более поздних версиях панд мы можем достичь этого результата, используя iloc и помощь другого метода:

>>> df.iloc[:df.index.get_loc('c') + 1, :4]
    x   y   z   8
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN

get_loc() это индексный метод, означающий «получить позицию метки в этом индексе». Обратите внимание, что поскольку нарезка с iloc не является конечной точкой, мы должны добавить 1 к этому значению, если хотим также строку 'c'.

В документации pandas есть дополнительные примеры .

-1
задан user3622613 22 May 2014 в 08:08
поделиться

2 ответа

У меня была аналогичная проблема, похоже, что она была вызвана LinkMovementMethod, используемой для моего EditText с ClickableSpan.

В моем случае проблема воспроизводится только с помощью editText.setMovementMethod(LinkMovementMethod.getInstance());

Итак, для обработки кликов на ClickableSpan без LinkMovementMethod - добавьте пользовательский onClickListener, что-то вроде этого:

editText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Editable editable = editText.getText();
                int pos = editText.getSelectionStart();
                ClickableSpan[] link = editable.getSpans(pos,pos, ClickableSpan.class);
                if (link.length != 0) {
                    link[0].onClick(v);
                }
            }
        });
0
ответ дан Chupik 4 September 2018 в 07:54
поделиться

Значения индекса начинаются с 0. Вы пытаетесь получить доступ к символу в индексе -1 (который является недопустимым индексом). Вот почему вы получаете исключение. Может быть, вам нужно исправить цикл, который выходит из действительного индекса при перемещении символов.

Пожалуйста, проверьте IndexOutOfBoundsException API

1
ответ дан Keerthivasan 4 September 2018 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: