it-roy-ru.com

Выбор строки pandas series / dataframe по целочисленному индексу

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

331
user1642513

повторяя @HYRY, смотрите новые документы в 0.11

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

Здесь у нас есть новые операторы: .iloc для 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

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

470
Jeff

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

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

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


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

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

df[2:3]

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

df[6:20:3]

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

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

44
Ted Petrou

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

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

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

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

22
HYRY

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

np_df = df.as_matrix()

а потом

np_df[i] 

должно сработать.

13
Pavel Prochazka

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

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)
7
waitingkuo

вы можете перебирать фрейм данных, как это.

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