5

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

32

Я столкнулся с проблемой при работе с DataFrame в Pandas. Меня интересует, почему df[2] не поддерживается, тогда как df.ix[2] и df[2:3] работают корректно.

Вот пример работы с DataFrame:

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

5 ответ(ов)

8

В ответ на вопрос на StackOverflow, как упомянул @HYRY, обратите внимание на новую документацию в версии 0.11:

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

Теперь у нас есть новые операторы: .iloc, который явно поддерживает только индексирование по целым числам, и .loc, который явно поддерживает только индексирование по меткам.

Например, рассмотрим следующий сценарий:

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

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

0

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

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

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

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

0

В доступе к таблице Pandas с помощью индексации можно также рассмотреть вариант numpy.as_array, чтобы преобразовать таблицу в массив Numpy следующим образом:

np_df = df.values

После этого вы сможете использовать индекс для доступа к строкам:

np_df[i]

Обратите внимание, что метод as_matrix() устарел, и рекомендуется использовать df.values для получения массива.

0

Вы можете перебрать данные в DataFrame следующим образом:

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

Этот код использует цикл для обращения к элементам в DataFrame, начиная с первого индекса. Имейте в виду, что dataframe_c.size возвращает общее количество элементов в DataFrame, поэтому вы можете получить доступ к каждой строке или ячейке данных по индексу. Однако стоит отметить, что такой подход может быть не самым эффективным для работы с большими DataFrame. Рассмотрите возможность использования методов, таких как iterrows() или itertuples(), для более удобного перебора строк.

0

Если вы хотите индексировать несколько строк по их целочисленным индексам, используйте список индексов:

idx = [2, 3, 1]
df.iloc[idx]

Примечание: Если idx создается по какому-либо правилу, вы также можете отсортировать датафрейм, используя .iloc (или .loc), поскольку вывод будет отсортирован по idx. Таким образом, в определенном смысле, iloc может работать как функция сортировки, где idx является ключом сортировки.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь