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)