Выбор строки из pandas Series/DataFrame по целочисленному индексу
Я столкнулся с проблемой при работе с 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 ответ(ов)
В ответ на вопрос на 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
Обратите внимание, что []
используется для среза строк (по меткам расположения) только.
Вы можете думать о DataFrame как о словаре Series. Когда вы используете df[key]
, это пытается выбрать столбец по индексу key
и возвращает объект Series.
Однако обрезка внутри квадратных скобок ([]
) выполняет срез по строкам, так как это очень распространенная операция.
Вы можете прочитать документацию для получения подробной информации:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
В доступе к таблице Pandas с помощью индексации можно также рассмотреть вариант numpy.as_array, чтобы преобразовать таблицу в массив Numpy следующим образом:
np_df = df.values
После этого вы сможете использовать индекс для доступа к строкам:
np_df[i]
Обратите внимание, что метод as_matrix()
устарел, и рекомендуется использовать df.values
для получения массива.
Вы можете перебрать данные в DataFrame следующим образом:
for ad in range(1, dataframe_c.size):
print(dataframe_c.values[ad])
Этот код использует цикл для обращения к элементам в DataFrame, начиная с первого индекса. Имейте в виду, что dataframe_c.size
возвращает общее количество элементов в DataFrame, поэтому вы можете получить доступ к каждой строке или ячейке данных по индексу. Однако стоит отметить, что такой подход может быть не самым эффективным для работы с большими DataFrame. Рассмотрите возможность использования методов, таких как iterrows()
или itertuples()
, для более удобного перебора строк.
Если вы хотите индексировать несколько строк по их целочисленным индексам, используйте список индексов:
idx = [2, 3, 1]
df.iloc[idx]
Примечание: Если idx
создается по какому-либо правилу, вы также можете отсортировать датафрейм, используя .iloc
(или .loc
), поскольку вывод будет отсортирован по idx
. Таким образом, в определенном смысле, iloc
может работать как функция сортировки, где idx
является ключом сортировки.
Выбор нескольких колонок в DataFrame Pandas
Как получить значение из ячейки датафрейма?
Как преобразовать индекс DataFrame в колонку в pandas?
Python Pandas: Как получить индексы строк, где значение в столбце соответствует заданному?
Как сбросить индекс в DataFrame pandas?