Как сбросить индекс в DataFrame pandas?
У меня есть DataFrame, из которого я удалил некоторые строки. В результате я получил DataFrame с индексом, который выглядит как [1,5,6,10,11]
, и мне нужно сбросить его до [0,1,2,3,4]
. Как я могу это сделать?
Похоже, что следующее решение работает:
df = df.reset_index()
del df['index']
Однако следующий код не сработал:
df = df.reindex()
Как я могу правильно сбросить индекс в этом случае?
3 ответ(ов)
Альтернативные решения заключаются в присвоении индекса RangeIndex
или использования range
:
df.index = pd.RangeIndex(len(df.index))
df.index = range(len(df.index))
Эти способы работают быстрее:
df = pd.DataFrame({'a':[8,7], 'c':[2,4]}, index=[7,8])
df = pd.concat([df]*10000)
print (df.head())
Выполнив тесты времени на этих операциях, можно заметить следующее:
In [298]: %timeit df1 = df.reset_index(drop=True)
10000 loops, best of 3: 105 µs per loop
In [299]: %timeit df.index = pd.RangeIndex(len(df.index))
100000 loops, best of 3: 7.84 µs per loop
In [300]: %timeit df.index = range(len(df.index))
100000 loops, best of 3: 14.2 µs per loop
Как видно из результатов, метод reset_index
работает значительно медленнее, чем прямое присвоение индекса с использованием RangeIndex
или range
. Это может быть полезным при работе с большими DataFrame, помимо улучшения производительности.
Команда data1.reset_index(inplace=True)
в библиотеке pandas используется для сброса индекса DataFrame data1
. Этот метод возвращает новый DataFrame, в котором текущий индекс заменяется на стандартный (числовой) индекс, и старый индекс добавляется как новый столбец. Параметр inplace=True
указывает, что изменения будут применены непосредственно к оригинальному DataFrame, а не возвращены в виде нового объекта.
Если вы хотите сбросить индекс и сохранить изменения в текущем DataFrame, то приведенная команда как раз для этого и подходит. Если же вы хотите получить новый DataFrame без изменения оригинала, можно использовать data1.reset_index()
, не применяя inplace=True
.
df.reset_index(drop=True)
эффективно заменяет индекс на стандартный RangeIndex. Альтернативный способ сделать то же самое — сразу же назначить новый индекс с помощью set_axis()
(что, я полагаю, и пытался сделать автор вопроса с помощью reindex
). Таким образом, следующие два варианта возвращают один и тот же результат:
df1 = df.set_axis(range(len(df)))
df2 = df.reset_index(drop=True)
Обратите внимание, что большинство методов/функций в pandas, которые удаляют или изменяют строки, такие как drop_duplicates()
, sort_values()
, dropna()
, pd.concat()
и т. д., имеют параметр ignore_index
, который при передаче значения True
сбрасывает индекс в RangeIndex в одном вызове функции. Так что имейте это в виду, если вы удаляете или добавляете строки в DataFrame. Пример:
df.dropna().reset_index(drop=True) # <--- вместо этого
df.dropna(ignore_index=True) # <--- используйте это
Таким образом, вы также можете воспользоваться параметром inplace
.
df1 = df.dropna().reset_index(drop=True) # <--- нужно присвоить DataFrame
df.dropna(ignore_index=True, inplace=True) # <--- `df` модифицируется на месте
Если вы использовали groupby
и хотите заменить индекс на стандартный RangeIndex, существует параметр as_index
, который при передаче значения False
сбрасывает индекс на RangeIndex в одном вызове функции. Таким образом, вместо df.groupby('col1').mean().reset_index()
, используйте df.groupby('col1', as_index=False).mean()
.
Выбор нескольких колонок в DataFrame Pandas
Как получить значение из ячейки датафрейма?
Как преобразовать индекс DataFrame в колонку в pandas?
Выбор строки из pandas Series/DataFrame по целочисленному индексу
Python Pandas: Как получить индексы строк, где значение в столбце соответствует заданному?