Pandas сбой при повторном DataFrame.reset_index()

Очень странная ошибка здесь: я использую pandas для слияния нескольких фреймов данных. Как часть слияния, я должен вызвать reset_index несколько раз. Но когда я это делаю, он неожиданно срабатывает при втором или третьем использовании reset_index.

Здесь минимальный код для воспроизведения ошибки:

import pandas
A = pandas.DataFrame({
    'val' :  ['aaaaa', 'acaca', 'ddddd', 'zzzzz'],
    'extra' : range(10,14),
})
A = A.reset_index()
A = A.reset_index()
A = A.reset_index()

Здесь соответствующая часть трассировки:

....
    A = A.reset_index()
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 2393, in reset_index
    new_obj.insert(0, name, _maybe_cast(self.index.values))
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 1787, in insert
    self._data.insert(loc, column, value)
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/internals.py", line 893, in insert
    raise Exception('cannot insert %s, already exists' % item)
Exception: cannot insert level_0, already exists

Любая идея, что здесь происходит не так? Как мне обойти это?

Ответы

Ответ 1

Проверяя frame.py, похоже, что pandas пытается вставить столбец 'index' или 'level_0'. Если оба из них (??) уже приняты, то он выдает ошибку.

К счастью, есть опция "drop". AFAICT, это уменьшает существующий индекс с тем же именем и заменяет его новым индексом reset. Это может вызвать у вас проблемы, если у вас есть столбец с именем "index", но я думаю, что в противном случае вы в порядке.

"Исправлен" код:

import pandas
A = pandas.DataFrame({
    'val' :  ['aaaaa', 'acaca', 'ddddd', 'zzzzz'],
    'extra' : range(10,14),
})
A = A.reset_index(drop=True)
A = A.reset_index(drop=True)
A = A.reset_index(drop=True)