2017-12-29 12 views
1

나는 다중 색인 dataframe의 마지막 가능한 날짜를 얻으려고 : 너무 좋아 지금까지팬더 PeriodIndex 부울 슬라이스 반환 전체 인덱스

ix = pd.MultiIndex.from_product([["a"], pd.PeriodIndex(start="2017-01", end="2017-03")]) 
df = pd.DataFrame(data=[0,1, np.nan], index=ix, columns=["test"]) 
df # outputs 
      test 
a 2017-01 0.0 
    2017-02 1.0 
    2017-03 NaN 

을하지만,이 슬라이스 마지막 반환에게 전체 인덱스를 반환 :

df.loc[df["test"].notnull(), "test"].index 
MultiIndex(levels=[['a'], [2017-01, 2017-02, 2017-03]], labels=[[0, 0], [0, 1]]) 

내 생각 .index.levels[1][-1] 마지막 요소는 Period('2017-02') 같은이 곳은 배열을 반환해야입니까? 실제로

+1

'df.last_valid_index()'? – ayhan

+0

@ayhan 니스! 뭔가 배웠습니다. 당신은 대답을 쓸 것입니까? –

+1

@ cᴏʟᴅs MC 예제가 MCVE를 만들기위한 방법 일 뿐이며 실제 문제는 사용하지 않는 인덱스를 유지하는 것입니다. 귀하의 대답에 대해 언급하십시오. :) – ayhan

답변

3

, 그것은해야하고, 당신이 당신이 그렇게 원하는 경우, remove_unused_levels 사용하여 그렇게 할 수 있습니다 -

i = df.loc[df["test"].notnull(), "test"] 
i.index = i.index.remove_unused_levels() 
i.index 
MultiIndex(levels=[['a'], [2017-01, 2017-02]], 
      labels=[[0, 0], [0, 1]]) 

이 기능은 실제로 현재 dataframe에 존재하지 않는 수준을 제거 일부분.

i.index.values 
array([('a', Period('2017-01', 'M')), ('a', Period('2017-02', 'M'))], dtype=object) 

는 질문과 같은 암시대로 (원하는 바로 마지막 유효 인덱스의 경우 -


또는, values 속성을 쿼리하여 index의 현재 값을 볼 수 있습니다), @ayhan's suggestion을 사용할 수 있습니다. last_valid_index -

i.last_valid_index() 
('a', Period('2017-02', 'M')) 
이 두 값을 쿼리 외에 이러한 기능에 대한 더 많은 사용이 아니다

i.first_valid_index() 
('a', Period('2017-01', 'M')) 

-210

그것은, first_valid_index을 자매 기능이 있습니다.

+0

이 작업을 자동으로 수행하는 것이 이상하게 보입니다. 고맙습니다! – Tony

+0

@Tony 사실,하지만 확실한 이유가 있습니다. 다음 번에 Andy 나 Jeff를 만나면 나는 그들에게 물을 것이다 :-) –

+0

이 문제에 관해서, 나는 마지막 질문이 필요했기 때문에 @ ayhan의 대답으로 갔다. 그러나 이전의 대답은이 색인을 다른 데이터 프레임으로 전달하려고하는 다음 질문을 다루었습니다. 너 둘 다 락. – Tony