Pandas 过滤后取消多索引数据帧堆栈时出现越界错误

Pandas 过滤后取消多索引数据帧堆栈时出现越界错误,pandas,dataframe,multiple-columns,Pandas,Dataframe,Multiple Columns,我有一个多索引数据帧,我对它执行一些操作(包括删除带有空值的列),然后尝试取消堆栈。。。但是,这会导致索引错误。有办法解决这个问题吗?代码如下: ds = ds.unstack(level='Symbol') ds.columns = ds.columns.swaplevel(0, 1) ds = ds[start:end] ds = ds[equities] ds = ds.stack(level='Symbol') ds.dropna(axis=1, inplace=True) # this

我有一个多索引数据帧,我对它执行一些操作(包括删除带有空值的列),然后尝试取消堆栈。。。但是,这会导致索引错误。有办法解决这个问题吗?代码如下:

ds = ds.unstack(level='Symbol')
ds.columns = ds.columns.swaplevel(0, 1)
ds = ds[start:end]
ds = ds[equities]
ds = ds.stack(level='Symbol')
ds.dropna(axis=1, inplace=True) # this line breaks the code
ds = ds.unstack(level='Symbol')
ds.head()
如果没有dropna行,代码执行得很好,因此这会破坏索引。。。这对我来说似乎是个错误。这会对某些数据帧(但并非所有数据帧)抛出错误,因此可能只针对某些情况。任何帮助都将不胜感激

转储以下错误日志:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-341-efb7e680485a> in <module>()
      9 #ds.dropna(axis=1, inplace=True)
     10 
---> 11 ds = ds.unstack(level='Symbol')
     12 
     13 ds.head()

~/.local/lib/python3.5/site-packages/pandas/core/frame.py in unstack(self, level, fill_value)
   4567         """
   4568         from pandas.core.reshape.reshape import unstack
-> 4569         return unstack(self, level, fill_value)
   4570 
   4571     _shared_docs['melt'] = ("""

~/.local/lib/python3.5/site-packages/pandas/core/reshape/reshape.py in unstack(obj, level, fill_value)
    467     if isinstance(obj, DataFrame):
    468         if isinstance(obj.index, MultiIndex):
--> 469             return _unstack_frame(obj, level, fill_value=fill_value)
    470         else:
    471             return obj.T.stack(dropna=False)

~/.local/lib/python3.5/site-packages/pandas/core/reshape/reshape.py in _unstack_frame(obj, level, fill_value)
    480         unstacker = partial(_Unstacker, index=obj.index,
    481                             level=level, fill_value=fill_value)
--> 482         blocks = obj._data.unstack(unstacker)
    483         klass = type(obj)
    484         return klass(blocks)

~/.local/lib/python3.5/site-packages/pandas/core/internals.py in unstack(self, unstacker_func)
   4349         new_columns = new_columns[columns_mask]
   4350 
-> 4351         bm = BlockManager(new_blocks, [new_columns, new_index])
   4352         return bm
   4353 

~/.local/lib/python3.5/site-packages/pandas/core/internals.py in __init__(self, blocks, axes, do_integrity_check, fastpath)
   3035         self._consolidate_check()
   3036 
-> 3037         self._rebuild_blknos_and_blklocs()
   3038 
   3039     def make_empty(self, axes=None):

~/.local/lib/python3.5/site-packages/pandas/core/internals.py in _rebuild_blknos_and_blklocs(self)
   3123         for blkno, blk in enumerate(self.blocks):
   3124             rl = blk.mgr_locs
-> 3125             new_blknos[rl.indexer] = blkno
   3126             new_blklocs[rl.indexer] = np.arange(len(rl))
   3127 

IndexError: index 100352 is out of bounds for axis 1 with size 100352
---------------------------------------------------------------------------
索引器回溯(最后一次最近调用)
在()
9#ds.dropna(轴=1,在位=True)
10
--->11 ds=ds.unstack(level='Symbol')
12
13 ds.总目(
取消堆栈中的~/.local/lib/python3.5/site-packages/pandas/core/frame.py(自身、级别、填充值)
4567         """
4568从pandas.core.resporate.resporate导入取消堆栈
->4569返回取消堆叠(自身、水平、填充值)
4570
4571共享文档['melt']=(“”“
取消堆栈中的~/.local/lib/python3.5/site-packages/pandas/core/restrape/restrape.py(对象、级别、填充值)
467如果存在(obj,数据帧):
468如果存在(对象索引、多索引):
-->469返回-取消堆叠帧(对象、级别、填充值=填充值)
470其他:
471返回obj.T.stack(dropna=False)
框架中的~/.local/lib/python3.5/site-packages/pandas/core/restrape/restrape.py(对象、级别、填充值)
480拆垛机=部分(_拆垛机,索引=对象索引,
481级别=级别,填充值=填充值)
-->482块=对象\数据取消堆栈(取消堆栈)
483 klass=类型(obj)
484返回klass(块)
取消堆栈中的~/.local/lib/python3.5/site-packages/pandas/core/internals.py(self,unstacker_func)
4349新列=新列[列\u掩码]
4350
->4351 bm=块管理器(新的块,[新的列,新的索引])
4352返回bm
4353
~/.local/lib/python3.5/site-packages/pandas/core/internals.py in uuu_______________________________
3035自我巩固检查()
3036
->3037自我重建、blknos和blklocs()
3038
3039 def使_为空(自身,轴=无):
~/.local/lib/python3.5/site-packages/pandas/core/internals.py in_rebuild_blknos_和_blklocs(self)
3123对于枚举中的blkno、blk(自块):
3124 rl=blk.mgr\U locs
->3125新的blknos[rl.索引器]=blkno
3126 new_blklocs[rl.indexer]=np.arange(len(rl))
3127
索引器:索引100352超出大小为100352的轴1的界限

问题是
dropna
删除一些行,因此
MultiIndex
的值也会删除,但默认情况下,
MultiIndex
不会更改。因此需要通过从
MultiIndex
中删除这些不必要的值


数据是机密的吗?没有数据很难发现问题。不幸的是,我一直在尝试用一个例子来说明问题。我能够模拟一个例子,但没有确定问题的根本原因:(好的,什么是
print(type(ds))
之前
dropna
?因为如果是系列,请尝试
ds.dropna(inplace=True)
绝对不是一个系列,它是一个DataFrame对象()。我正在删除带有任何空值的列,作为我的机器学习模型的预处理步骤。这非常有效,感谢您的回答和解释(以及耐心)!@J.Vasquez-是的,没有数据不容易,但这对你来说真的很好。祝你愉快!@J.Vasquez如果我的答案有帮助,别忘了-单击答案旁边的复选标记,将其从灰色变为填充。谢谢。
ds = ds.stack(level='Symbol')
ds.dropna(axis=1, inplace=True)

ds.index = ds.index.remove_unused_levels()

ds = ds.unstack(level='Symbol')