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. Есть ли причина дизайна для не поддерживать индексирование строки одним целым?

Ответ 1

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

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

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

например. представить этот сценарий

In [1]: df = DataFrame(randn(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

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

Ответ 2

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

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

Подробное описание документа можно прочитать:

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

Ответ 3

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

np_df = df.as_matrix()

а затем

np_df[i] 

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

Ответ 4

Основной задачей оператора индексирования DataFrame, [] является выбор столбцов.

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

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


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

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

df[2:3]

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

df[6:20:3]

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

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

Ответ 5

Вы можете посмотреть исходный код.

DataFrame имеет частную функцию _slice(), чтобы нарезать DataFrame, и позволяет параметру axis определять, какая ось для среза. __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)

Ответ 6

вы можете прокручивать кадр данных, как это.

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