我无法弄清楚我从数据帧上的分层索引中获得这种奇怪的行为。简而言之,我想做的事情非常简单;我试图弄清楚元组是否在我的数据帧的索引中。
这是我期望的行为:
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
!
我在这里缺少什么?
答案 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邮件列表。