AssertionError:unstack()datafram时blk ref_loc中的间隙

2024-10-17 06:27:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试取消Pandas数据帧中的stack()数据,但我一直收到这个错误,我不知道为什么。这是我目前为止的代码和我的数据样本。我试图修复它的方法是删除voteId不是数字的所有行,这对我的实际数据集不起作用。当我部署代码时,在Anaconda笔记本(我正在开发的地方)和我的产品env中都会发生这种情况。在

我不知道如何在我的示例代码中重现错误。。。可能是因为像我在示例中那样实例化数据帧时不存在的类型转换问题?在

#dataset simulate likely input
# d = {'vote': [100, 50,1,23,55,67,89,44], 
#      'vote2': [10, 2,18,26,77,99,9,40], 
#      'ballot1': ['a','b','a','a','b','a','c','c'],
#      'voteId':[1,2,3,4,5,'aaa',7,'NaN']}
# df1=pd.DataFrame(d)
#########################################################

df1=df1.drop_duplicates(['voteId','ballot1'],keep='last')

s=df1[:10].set_index(['voteId','ballot1'],verify_integrity=True).unstack()
s.columns=s.columns.map('(ballot1={0[1]}){0[0]}'.format) 
dflw=pd.DataFrame(s)

完整错误消息/堆栈跟踪:

^{pr2}$

Tags: columns数据方法代码示例dataframepandasstack
2条回答

要获取触发异常的实际数据,请添加额外的调试信息

Modify ~/anaconda3/lib/python3.6/site-packages/pandas/core/internals.py

class BlockManager()添加行

def __init__(self)
    print('BlockManager blocks')
    pprint(self.blocks)
    print('BlockManager axes')
    pprint(self.axes)

您将数据:

^{pr2}$

Modify ~/anaconda3/lib/python3.6/site-packages/pandas/core/reshape/reshape.py

def __unstack_frame(self, ...)
    from pprint import pprint
    print('_unstack_frame level {} fill_value {} {}'.format(level, fill_value, type(obj)))
    pprint(obj)

您将看到以下数据:


BlockManager blocks
(FloatBlock: slice(0, 16, 1), 16 x 8, dtype: float64,)
BlockManager axes
[MultiIndex(levels=[[u'vote', u'vote2'], [False, 8, u'\n', u' ', u'\', u'aaa', u'xx']],
           labels=[[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], [-1, 0, 1, 2, 3, 4, 5, 6, -1, 0, 1, 2, 3, 4, 5, 6]],
           names=[None, u'voteId']),
 Index([nan, -1, False, True, u'', u'a', u'b', u'c'], dtype='object', name=u'ballot1')]

我用另一个例子触发了一个异常:

  File "/usr/lib64/python2.7/site-packages/pandas/core/internals.py", line 2902, in _rebuild_blknos_and_blklocs
    raise AssertionError("Gaps in blk ref_locs")
AssertionError: Gaps in blk ref_locs


带调试信息

BlockManager blocks
(FloatBlock: [-1, -1, -1], 3 x 2, dtype: float64,)
BlockManager axes
[Index([aaa, bbb, ccc], dtype='object'), Int64Index([0, 1], dtype='int64')]

我用你的示例代码做了一些测试。在

观察1:

这是一个关于该问题的最小可验证代码:

import pandas as pd
from IPython.display import display

#dataset simulate likely input
d = {'vote': [100, 50,1,23,55,67,89,44], 
     'vote2': [10, 'a',18,55,77,99,9,40], 
     'ballot1': [1,None,3,4,5,6,7,8],
     'voteId':[1,2,3,4,5,6,7,8]}
df1 = pd.DataFrame(d)
#########################################################

df1 = df1.drop_duplicates(['voteId','ballot1'],keep='last')

s = df1[:10].reset_index().set_index(['voteId','ballot1'],verify_integrity=True).unstack()
s.columns=s.columns.map('(ballot1={0[1]}){0[0]}'.format)
dflw=pd.DataFrame(s)
display(dflw)

假设一下,这些数据可以是我稍微修改一下后发现的(在这个例子的基础上):

^{pr2}$

观察2:

我还制作了另一个数据集(可能更接近您的数据集):

d = {'vote': [10, None,2,23,55,67,89,44],
     'vote2': [10,2,3,55,77,99,9,40],
     'ballot1': [1,None,3,4,5,6,7,8],
     'voteId':['a','b','a','a','c','a','c','a']}
df1 = pd.DataFrame(d)

有趣的是,ballot1和voteId的顺序与你的情况不同,如果它们的顺序与你的情况相同,就可以了。在

我的观察是,ballot1是一个真正需要cap失败的索引,并且一个投票序列之间需要一个共享值。在

讨论:

如果可能的话,ballot1和voteId(索引)都只有整数,但是ballot1也有一些异常,这取决于投票列中的数据,这个错误可能会引起。在

当索引列值有间隙时,将引发断言,它可能与您的df1[:10]命令有关,例如ZevGithub上的问题进行了注释。在

在我的例子中,虽然Github建议的解决方法没有效果。最好的办法是去掉数据中的None值,因为数据已经处于良好的状态。在

旁注:

我不知道ballot1数据是否允许有整数,但至少如果允许的话,就存在这种情况,在这种情况下可能会发生错误。这些是否有用取决于你的情况,你在写问题的时候还不清楚。现在你至少有一些建议可以尝试。

相关问题 更多 >