5

Как сбросить индекс в DataFrame pandas?

26

У меня есть DataFrame, из которого я удалил некоторые строки. В результате я получил DataFrame с индексом, который выглядит как [1,5,6,10,11], и мне нужно сбросить его до [0,1,2,3,4]. Как я могу это сделать?

Похоже, что следующее решение работает:

df = df.reset_index()
del df['index']

Однако следующий код не сработал:

df = df.reindex()

Как я могу правильно сбросить индекс в этом случае?

3 ответ(ов)

0

Альтернативные решения заключаются в присвоении индекса 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, помимо улучшения производительности.

0

Команда data1.reset_index(inplace=True) в библиотеке pandas используется для сброса индекса DataFrame data1. Этот метод возвращает новый DataFrame, в котором текущий индекс заменяется на стандартный (числовой) индекс, и старый индекс добавляется как новый столбец. Параметр inplace=True указывает, что изменения будут применены непосредственно к оригинальному DataFrame, а не возвращены в виде нового объекта.

Если вы хотите сбросить индекс и сохранить изменения в текущем DataFrame, то приведенная команда как раз для этого и подходит. Если же вы хотите получить новый DataFrame без изменения оригинала, можно использовать data1.reset_index(), не применяя inplace=True.

0

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().

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