Допустим, у меня есть панд Series
, и я хочу, чтобы получить доступ к набору элементов в конкретных показателях, например, так:Панды методы индексатор и кортежи в качестве параметров
In [1]:
from pandas import Series
import numpy as np
s = Series(np.arange(0,10))
In [2]: s.loc[[3,7]]
Out[2]:
3 3
7 7
dtype: int64
Метод .loc
принимает list
в качестве параметра для этого типа выбора. Методы .iloc
и .ix
работают одинаково.
Однако, если я использую tuple
для параметра, как .loc
и .iloc
неудачу:
In [5]: s.loc[(3,7)]
---------------------------------------------------------------------------
IndexingError Traceback (most recent call last)
........
IndexingError: Too many indexers
In [6]: s.iloc[(3,7)]
---------------------------------------------------------------------------
IndexingError Traceback (most recent call last)
........
IndexingError: Too many indexers
И .ix
производит странный результат:
In [7]: s.ix[(3,7)]
Out[7]: 3
Теперь я понимаю, что вы можете» t даже сделать это с необработанным питоном list
:
In [27]:
x = list(range(0,10))
x[(3,7)]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-27-cefdde088328> in <module>()
1 x = list(range(0,10))
----> 2 x[(3,7)]
TypeError: list indices must be integers or slices, not tuple
Чтобы получить набор конкретных индексов от list
, вам необходимо использовать понимание, as explained here.
Но, с другой стороны, с помощью tuple
для выбора строк из pandas DataFrame
, похоже, отлично работает для всех трех методов индексирования. Вот пример с методом .loc
:
In [8]:
from pandas import DataFrame
df = DataFrame({"x" : np.arange(0,10)})
In [9]:
df.loc[(3,7),"x"]
Out[9]:
3 3
7 7
Name: x, dtype: int64
Мои три вопроса являются:
- Почему не в
Series
индексаторах принятьtuple
? Казалось бы,
естественным для использованияtuple
, так как набор желаемых индексов является
неизменяемым, одноразовым параметром. Является ли это исключительно для целей , имитирующих интерфейсlist
? - Каково объяснение странного результата
Series
.ix
? - Почему несоответствие между
Series
иDataFrame
по этому вопросу?
Согласовано на всех. Чтобы ответить на ваш первый вопрос, все, что я пытаюсь сделать, это использовать синтаксис, который, я думаю, был бы естественным. Вы могли бы подумать, что определенный набор номеров индексов будет таким же неизменным, как и все, и «кортеж» будет иметь смысл. Это не конец света, что я не могу использовать «кортеж», и я особо не зацикливаюсь на этом. В конце концов, неспособность сделать это не помешала мне так сильно, как вызвать мое любопытство. –
Отличный ответ. Я бы сказал, что 's.ix [(3, 7)]' return '3' является ошибкой. Я не могу представить, как это может быть предполагаемое поведение, и я думаю, что это пример того, как неожиданные исходные данные когда-то плохо обрабатываются в Pandas. – JoeCondron
@JoeCondron да, хороший пункт! полностью согласен с вами в этом. – JohnE