【问题标题】:pandas crashes on repeated DataFrame.reset_index()熊猫在重复 DataFrame.reset_index() 上崩溃
【发布时间】:2012-08-25 14:18:23
【问题描述】:

这里有一个非常奇怪的错误:我正在使用 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

知道这里出了什么问题吗?我该如何解决?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以使用:

    A.reset_index(drop=True, inplace=True)

    【讨论】:

      【解决方案2】:

      检查 frame.py,看起来 pandas 尝试插入列“index”或“level_0”。如果其中一个/两个(??)已经被占用,那么它会抛出错误。

      幸运的是,有一个“丢弃”选项。 AFAICT,这将删除具有相同名称的现有索引并将其替换为新的重置索引。如果你有一个名为“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)
      

      【讨论】:

      • Pandas 仅在原始帧的索引没有名称或 MultiIndex 级别在 MultiIndex 的情况下没有名称的情况下尝试在 reset_index 之后设置新列的名称。 A.index.name = 'index1'; A = A.reset_index(); A.index.name = "index2"; A = A.reset_index(); A.index.name = 'index3'; A = A.reset_index()... 可以去一个
      猜你喜欢
      • 2014-10-11
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 2014-05-25
      • 2019-04-07
      • 2017-12-23
      相关资源
      最近更新 更多