2014-01-16 3 views
4

첫 번째 수준을 그룹 ID로 사용하고 두 번째 수준을 요소 이름으로 사용하는 다중 인덱스 DataFrame이 있습니다. 더 많은 그룹이 있지만 첫 번째 그룹 만 아래에 표시됩니다.다른 DataFrame을 사용하는 팬더 DataFrame

    2000-01-04 2000-01-05 
Group Element          
1  A   -0.011374 0.035895 
     X   -0.006910 0.047714 
     C   -0.016609 0.038705 
     Y   -0.088110 -0.052775 
     H   0.000000 0.008082 

그룹 ID 인 인덱스가 하나 뿐인 다른 DataFrame이 있습니다. 둘 다에 대한 열은 동일하며 날짜입니다. 궁극적으로

    2000-01-04 2000-01-05 
Group Element          
1  A   False  False  
     X   False  False  
     C   False  False  
     Y   True   True 
     H   False  False  

:

  2000-01-04 2000-01-05 
Group          
1  -0.060623 -0.025429 
2  -0.066765 -0.005318 
3  -0.034459 -0.011243 
4  -0.051813 -0.019521 
5  -0.064367 0.014810 

나는 이런 식으로 뭔가를 얻기 위해 각 요소는 해당 날짜에 그룹의 값보다 작은 경우 확인하여 첫 번째를 필터링하는 두 번째 DataFrame를 사용하려면 나는 참된 요소들과 그들이 참이었던 날짜들에만 관심이있다. 반복되는 날짜에 대해 true였던 요소의 목록은 좋을 것입니다. False NaN을 작성한 다음 dropNa()를 사용하여 수행 할 수 있습니다.

이 작업을 위해 루프를 중첩하여 작성할 수 있지만 시간은 매우 중요합니다. 나는 팬더 데이터 프레임 구조를 본질적으로 그리고 파이썬으로 사용하여이 작업을 수행하는 방법을 생각할 수 없다. 어떤 도움이라도 대단히 감사하겠습니다!

답변

3

이 신청하기 GROUPBY을 사용할 수

In [11]: g = df1.groupby(level='Group') 

In [12]: g.apply(lambda x: x <= df2.loc[x.name]) 
Out[12]: 
       2000-01-04 2000-01-05 
Group Element      
1  A   False  False 
     X   False  False 
     C   False  False 
     Y    True  True 
     H   False  False 
+0

는 정말 고마워요! 그것은 위대한 작품. 관심이없는 df2 값은 각 그룹의 평균 - 표준 편차에 해당합니다. 기본적으로 이상 치를 찾으려고합니다. 제가 지금하고있는 것보다 더 좋은 방법이 있습니까? 또한 이는 임계 값 이하의 특이점을 찾는 것입니다. 나는 상한에 대해 또 다른 것을 만들려고했다. 그러나 더 우아한 방법이 있습니까? – rmalhotra

+0

@rmalhotra 위의 람다 표현식에서 (x로) 그룹에 액세스 할 수 있다고 생각하므로 다음을 계산할 수 있습니다. –

+0

다음과 같은 아웃 라이어를 찾기 위해 노력했습니다.'df.groupby ==) .apply (lambda x : x rmalhotra