2014-09-19 5 views
24

나는 이와 같이 보이는 데이터 프레임 df를 가지고 있습니다. 날짜와 시간은 2 다단계 인덱스입니다.인덱스를 사용하여 pandas multiindex 데이터 프레임을 반복하는 방법

      observation1 observation2 
date   Time        
2012-11-02 9:15:00  79.373668  224 
       9:16:00  130.841316  477 
2012-11-03 9:15:00  45.312814  835 
       9:16:00  123.776946  623 
       9:17:00  153.76646  624 
       9:18:00  463.276946  626 
       9:19:00  663.176934  622 
       9:20:00  763.77333  621 
2012-11-04 9:15:00  115.449437  122 
       9:16:00  123.776946  555 
       9:17:00  153.76646  344 
       9:18:00  463.276946  212 

일일 데이터 블록보다 복잡한 프로세스를 수행하고 싶습니다.

사이비 코드는 우선, 내가 날짜를

2012-11-03 9:15:00  45.312814  835 
       9:16:00  123.776946  623 
       9:17:00  153.76646  624 
       9:18:00  463.276946  626 
       9:19:00  663.176934  622 
       9:20:00  763.77333  621 

만 블록을 액세스하고 처리를 위해 보낼 수있는 방법을 찾을 수 없습니다, 그래서

for count in df(level 0 index) : 
    new_df = get only chunk for count 
    complex_process(new_df) 

과 같을 것이다. 내가 레벨 루프의 정확한 값을 언급하지 않고 그것을 할 수있는 방법이 있는지 모르겠 루프에 대해 이렇게하고 있습니다. 몇 가지 기본 검색을 수행하고 df.index.get_level_values ​​(0)을 얻을 수 있지만 모든 값을 반환하고 루프가 하루 동안 여러 번 실행됩니다. 하루에 데이터 프레임을 만들어 처리를 위해 보내고 싶습니다.

답변

37

인덱스의 첫 번째 레벨을 그룹화하면 쉽게 알 수 있습니다. groupby 객체를 반복하면 그룹 키와 각 그룹을 포함하는 서브 프레임이 반환됩니다.

In [136]: for date, new_df in df.groupby(level=0): 
    ...:  print(new_df) 
    ...:  
        observation1 observation2 
date  Time        
2012-11-02 9:15:00  79.373668   224 
      9:16:00 130.841316   477 

        observation1 observation2 
date  Time        
2012-11-03 9:15:00  45.312814   835 
      9:16:00 123.776946   623 
      9:17:00 153.766460   624 
      9:18:00 463.276946   626 
      9:19:00 663.176934   622 
      9:20:00 763.773330   621 

        observation1 observation2 
date  Time        
2012-11-04 9:15:00 115.449437   122 
      9:16:00 123.776946   555 
      9:17:00 153.766460   344 
      9:18:00 463.276946   212 
+0

이 도움이! 나는 처음에 인덱스 lable을 찾은 다음 iloc을 사용하여 그것을 조각 냈다. – Yantraguru

4

다음과 같이 @psorenson 응답 오프 태그

for idate in df.index.get_level_values('date'): 
    complex_process(df.ix[idate], idate) 
+1

이 솔루션을 신중하게 사용하면 idate의 각 값에 여러 번 누적 될 수 있습니다. np.unique의 idate에 대해 을 수행해야합니다 (df.index.get_level_values ​​('date')) : 추가 np.unique에주의하십시오. –

+0

@melbay가 지적한대로'df.index.get_level_values ​​('date'). unique()'이 더 나을 것이라고 생각합니다. –

0

, 우리는 고유의 레벨 지표와 NumPy와없이 관련 데이터 프레임 조각을 얻을 수 있습니다 :

for date in df.index.get_level_values('date').unique(): 
    print(df.loc[date]) 
관련 문제