Выбор строки серии pandas / фрейма данных по целочисленному индексу

мне любопытно, почему df[2] Не поддерживается, в то время как df.ix[2] и df[2:3] оба работают.

In [26]: df.ix[2]
Out[26]: 
A    1.027680
B    1.514210
C   -1.466963
D   -0.162339
Name: 2000-01-03 00:00:00

In [27]: df[2:3]
Out[27]: 
                  A        B         C         D
2000-01-03  1.02768  1.51421 -1.466963 -0.162339

Я бы ожидал df[2] работать так же, как df[2:3] чтобы соответствовать соглашению об индексации Python. Есть ли причина дизайна для поддержки индексирования строки одним целым числом?

6 ответов


Эхо @HYRY, см. новые документы в 0.11

http://pandas.pydata.org/pandas-docs/stable/indexing.html

здесь у нас новые операторы,.iloc to explicity поддерживает только целочисленную индексацию и .loc для поддержки explicity только индексирование меток

например, представьте себе такой сценарий

In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[] нарезает строки (по местоположению метки) только


основная цель оператора индексирования фрейма данных,[] выбрать столбцы.

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

Итак, в вопросе выше:df[2] поиск имени столбца, соответствующего целочисленному значению 2. Этот столбец не существует и KeyError поднимается.


оператор индексирования DataFrame полностью изменяет поведение для выбора строк при использовании нотации среза

странно, когда задан срез, оператор индексирования фрейма данных выбирает строки и может делать это по целочисленному местоположению или по метке индекса.

df[2:3]

это будет срезать, начиная с строки с целочисленным расположением 2 до 3, исключая последний элемент. Итак, только один ряд. Ниже выбираются строки, начинающиеся с целочисленного расположения 6, но не включающие 20 каждой третьей строки.

df[6:20:3]

вы также можно использовать срезы, состоящие из строковых меток, если в индексе фрейма данных есть строки. Дополнительные сведения см. В разделе это решение .iloc vs .loc.

я почти никогда не использую эту нотацию среза с оператором индексирования, поскольку она не является явной и почти никогда не используется. При нарезке по строкам придерживайтесь .loc/.iloc.


Вы можете думать, что DataFrame как дикт серии. df[key] попробуйте выбрать индекс столбца по key и возвращает объект Series.

однако нарезка внутри [] нарезает строки, потому что это очень распространенная операция.

Вы можете прочитать документ для детали:

http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics


для индексного доступа к таблице pandas также можно рассмотреть numpy.as_array возможность преобразования таблицы в массив Numpy как

np_df = df.as_matrix()

а то

np_df[i] 

будет работать.


вы можете цикл через фрейм данных, как это .

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])

вы можете взглянуть на исходный код .

DataFrame имеет частную функцию _slice() фрагмент DataFrame, и это позволяет параметр axis чтобы определить, какую ось нарезать. The __getitem__() на DataFrame не устанавливает ось при вызове _slice(). Так что _slice() срежьте его по оси 0 по умолчанию.

вы можете сделать простой эксперимент, который может помочь вам:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)