Примечание: в версии 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 есть дополнительные примеры .
У меня была аналогичная проблема, похоже, что она была вызвана 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
. Вы пытаетесь получить доступ к символу в индексе -1
(который является недопустимым индексом). Вот почему вы получаете исключение. Может быть, вам нужно исправить цикл, который выходит из действительного индекса при перемещении символов.
Пожалуйста, проверьте IndexOutOfBoundsException API