2014-09-01 4 views
3

내 데이터 분석은 단순하지만 iffy 모티프, 즉 "groupby everything except"로 반복됩니다. df이 다중 색인 예를 보자팬더의 하나의 색인 열을 제외한 모든 그룹화

이름과 상태에 대한 정보를 유지하면서, 예를 들어, 사용 가능한 모든 시련을 통해 평균 무엇 내가 지금하고 싶은
     accuracy velocity 
name condition trial      
john a   1  -1.403105 0.419850 
       2  -0.879487 0.141615 
    b   1  0.880945 1.951347 
       2  0.103741 0.015548 
hans a   1  1.425816 2.556959 
       2  -0.117703 0.595807 
    b   1  -1.136137 0.001417 
       2  0.082444 -1.184703 

. 쉽게 달성 할 수 있습니다 :

average = df.groupby(level=('name', 'condition')).mean() 

그러나 실제 상황에서는 멀티 색인에 훨씬 많은 메타 데이터가 저장되어 있습니다. 색인은 행당 8-10 개의 행을 쉽게 포함합니다. 따라서 위의 패턴은 매우 다루기 힘들어집니다. 궁극적으로 "폐기"작업을 찾고 있습니다. 단일 인덱스 열을 버리거나 줄이는 작업을 수행하려고합니다. 위의 경우에는 시범 번호입니다.

글 머리 기호를 물어봐야하나요? 아니면 이것에 대해 좀 더 관용적 인 방법이 있습니까? 이것은 안티 패턴 일 것입니다! 나는 "진실한 판다"방법에 관해서 알맞은 직감을 구축하고 싶다 ... 미리 감사드립니다.

당신은 이것에 대한 도우미 기능을 정의 할 수

답변

5

:

def allbut(*names): 
    names = set(names) 
    return [item for item in levels if item not in names] 

데모 :

import pandas as pd 
levels = ('name', 'condition', 'trial') 
names = ('john', 'hans') 
conditions = list('ab') 
trials = range(1, 3) 

idx = pd.MultiIndex.from_product(
    [names, conditions, trials], names=levels) 

df = pd.DataFrame(np.random.randn(len(idx), 2), 
         index=idx, columns=('accuracy', 'velocity')) 

def allbut(*names): 
    names = set(names) 
    return [item for item in levels if item not in names] 

In [40]: df.groupby(level=allbut('condition')).mean() 
Out[40]: 
      accuracy velocity 
trial name      
1  hans 0.086303 0.131395 
     john 0.454824 -0.259495 
2  hans -0.234961 -0.626495 
     john 0.614730 -0.144183 
너무 이상의 수준 제거 할 수 있습니다

:

In [53]: df.groupby(level=allbut('name', 'trial')).mean() 
Out[53]: 
      accuracy velocity 
condition      
a   -0.597178 -0.370377 
b   -0.126996 -0.037003 
+0

이것은 좋아 보인다. 나는 그 선을 따라 뭔가를 사용 해왔다. 당신은 패턴 자체가 소리라고 생각합니까? 동일한 결과를 얻는 "내장"방식이 더 있습니까? – ap3l

+1

'df.groupby (level = list (set (levels) - { 'name'})). mean()'과 같은 변형이 많이 있는데, 기본적으로 모두 같은 양이라고 생각합니다. - 특히 적은 수의 레벨의 경우. 더 "기본 제공"방식이 있다고 생각하지 않으므로 도우미 기능을 정의하는 것이 코드를 읽기 쉽게 만드는 가장 좋은 방법입니다. – unutbu

관련 문제