有分层索引设置行为的问题

时间:2014-07-10 17:42:11

标签: python pandas

我无法弄清楚我从数据帧上的分层索引中获得这种奇怪的行为。简而言之,我想做的事情非常简单;我试图弄清楚元组是否在我的数据帧的索引中。

这是我期望的行为

arrays = [[dt.date(2014,6,4), dt.date(2014,6,4), dt.date(2014,6,21), dt.date(2014,6,21),dt.date(2014,6,13), dt.date(2014,6,13), dt.date(2014,6,7), dt.date(2014,6,7)],['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
s = pd.Series(randn(8), index=index)
print (dt.date(2014,6,4),'one') in s.index
print (dt.date(2014,6,4),'fifty') in s.index
print (dt.date(2014,1,1),'one') in s.index

返回:

True 
False 
False

以下是面对

WeirdIdx = pd.MultiIndex(levels=[[dt.date(2014,7,4), dt.date(2014,7,5),dt.date(2014,7,6), dt.date(2014,7,7), dt.date(2014,7,8),dt.date(2014,7,9)], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]],labels=[[0, 0, 0, 0, 0], [8, 8, 8, 8, 8]],names=[u'day', u'hour'])
frame = pd.DataFrame({'a':np.random.normal(0,1,5)},index=WeirdIdx)
print type(frame)
print frame.index
print frame

的产率:

<class 'pandas.core.frame.DataFrame'>
day         hour
2014-07-04  8   
            8   
            8   
            8   
            8   
                        a
day        hour          
2014-07-04 8     0.335840
           8     0.801193
           8    -0.092492
           8     0.610675
           8    -0.044947

print (dt.date(2014,7,4),8) in frame.index
print (dt.date(2014,7,4),1) in frame.index
print (dt.date(2014,8,4),1) in frame.index

的产率:

True
True
True

最后:

frame.index

的产率:

MultiIndex(levels=[[2014-07-04, 2014-07-05, 2014-07-06, 2014-07-07, 2014-07-08, 2014-07-09], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]],
       labels=[[0, 0, 0, 0, 0], [8, 8, 8, 8, 8]],
       names=[u'day', u'hour'])

一个问题是(dt.date(2014,8,4),1) in frame.index 应该False

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

问题似乎是因为您的MultiIndex不是唯一的。在这种情况下,熊猫有奇怪的行为,我认为这是一个错误。这个问题与日期甚至DataFrame根本没有关系;它纯粹是一个MultiIndex问题。这是一个更简单的例子:

WeirdIdx = pandas.MultiIndex(
    levels=[[0], [1]],
    labels=[[0, 0], [0,0]],names=[u'X', u'Y']
)

然后任何正确大小和类型的元组都被认为包含在MultiIndex中:

>>> (0, 0) in WeirdIdx
True
>>> (1, 0) in WeirdIdx
True
>>> (100, 0) in WeirdIdx
True
>>> (100, 100) in WeirdIdx
True

查看源代码,我可以看到这些结果是如何产生的:如果MultiIndex不是唯一的,则索引会回退到切片,即使值不存在,切片也始终有效(只返回零长度切片)。但我不明白为什么事情就这样实施了。

我在pandas bug跟踪器上找不到有关此问题的错误,尽管有多种错误与重复的MutliIndex有关,例如this bug。关于this bug的一些评论表明问题应该已经在pandas 0.14中得到修复,但我不知道它是否已经修复,并且该bug仍然是开放的。我对各种错误报告的印象是MutliIndexes基本上不起作用,除非它们是唯一的。我建议打开一个bug报告和/或询问pandas邮件列表。