2014-07-10 4 views
1

데이터 프레임에있는 계층 적 인덱스에서 얻는이 이상한 동작을 파악할 수 없습니다. 요컨대, 내가하려는 것은 매우 간단합니다. 튜플이 내 데이터 프레임의 인덱스에 있는지 여부를 파악하려고합니다.계층 적 인덱스 문제 설정 동작 설정

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 

수율 :

여기
True 
False 
False 

내가 에 직면 오전 무엇 :

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 

반환

내가을 기대 동작입니다

<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']) 
,174,

하나의 문제는 (dt.date(2014,8,4),1) in frame.index입니다.False입니다!

무엇이 여기에 있습니까?

+0

작동하는 경우에 대한 예제를 제공했지만 그렇지 않은 경우는 제공하지 않았습니다. 보고있는 원치 않는 동작을 보여주는 샘플 DataFrame/Series를 제공 할 수 있습니까? – BrenBarn

+0

여기 뒤는 내가 직면 한 부분이다. 'print (dt.date (2014,1,4), 8)를 tmp에 넣는다.index'는'True '가되어서는 안됩니다 – tipanverella

+0

''datetime.date''는'작동 '을 사용하지만 판다의 힘을 이용하지는 않습니다. "datetime.datetime"을 사용하십시오. (또는 더 나은 방법으로, 날짜를 만드는데''date_range''를 사용하십시오.) – Jeff

답변

2

문제는 MultiIndex가 고유하지 않기 때문인 것으로 보입니다. 팬더는이 상황에서 이상한 행동을합니다. 버그를 생각합니다. 문제는 날짜 또는 DataFrames와 전혀 관련이 없습니다. 순전히 멀티 인덱스 문제입니다.

적당한 크기와 유형의 튜플이 MultiIndex에 포함 된 것으로 간주 그런
WeirdIdx = pandas.MultiIndex(
    levels=[[0], [1]], 
    labels=[[0, 0], [0,0]],names=[u'X', u'Y'] 
) 

:

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

소스 코드에 보면, 나는 이러한 결과가 발생하는 방법을 볼 수 있습니다 여기에 간단한 예입니다 : MultiIndex가 고유하지 않은 경우 슬라이스로 다시 인덱싱되며 슬라이싱은 값이없는 경우에도 작동합니다 (길이가 0 인 슬라이스 만 반환). 그러나 나는 그런 것들이 그렇게 구현 된 이유를 이해하지 못합니다.

중복 된 MutliIndexes와 관련된 다양한 버그가 있지만 (예 : this bug) 팬더 버그 추적기에서 버그를 찾을 수 없습니다. this bug에 대한 일부 의견은 팬더 0.14에서 문제가 해결되었음을 제안하지만 실제로 수정되었는지 여부는 알 수 없으며 버그는 여전히 열려 있습니다. 다양한 버그 리포트에서 내 인상은 MutliIndexes가 기본적으로 고유하지 않으면 작동하지 않는다는 것입니다. 나는 버그 리포트를 열거 나 팬더 메일 링리스트를 요청할 것을 제안한다.

+0

'pandas .__ version__ '이 (가) 0.14이므로 실행되지 않았습니다. – tipanverella

+0

어떻게 당신을 github에 인용합니까? – tipanverella

+0

@tipanverella :이 질문에 연결하면됩니다. – BrenBarn