Как сбросить индекс в 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?
Выбор нескольких колонок в DataFrame Pandas
Как получить значение из ячейки датафрейма?
Выбор строки из pandas Series/DataFrame по целочисленному индексу
Python Pandas: Как получить индексы строк, где значение в столбце соответствует заданному?