2016-06-02 9 views
3

저는 다양한 칼럼을 가진 데이터 프레임을 가지고 있으며, 각 그룹에 최소 유효 회원 수가 있다는 조건 하에서 그룹의 평균값을 계산하고 싶습니다. groupby, filter 및 mean을 사용하여 다음을 시도했습니다. 그것은 작동하는 것,하지만 나는 더 효율적인 솔루션이 있는지 궁금해?pandas groupby : 효율적인 조건부 집계?

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'id' : ['one', 'one', 'two', 'three', 'two', 
          'two', 'two', 'one', 'three', 'one'], 
        'idprop' : [1., 1., 2., 3., 2., # property corresponding to id 
           2., 2., 1., 3., 1.], 
        'x' : np.random.randn(10), 
        'y' : np.random.randn(10)}) 

# set a couple of x values to nan 
s = df['x'].values 
s[s < -0.6] = np.nan 
df['x'] = s 

g = df.groupby('id', sort=False) 
# filter out small group(s) with less than 3 valid values in x 
# result is a new dataframe 
dff = g.filter(lambda d: d['x'].count() >= 3) 

# this means we must group again to obtain the mean value of each filtered group 
result = dff.groupby('id').mean() 
print result 
print type(result) 

how to get multiple conditional operations after a Pandas groupby?에 관련된 문제가되는, 그러나, 기 요소의 수에 의해 행 값들만 "필터". 이것은 내 코드로 변환 될 것입니다 : 측면의 질문으로

res2 = g.agg({'x': lambda d: df.loc[d.index, 'x'][d >= -0.6].sum()}) 

: 아래 또는 NaN이에 주어진 임계 값을 초과 값을 설정하는보다 효율적인 방법이? 내가 loc를 사용하여 이것을 시도 할 때 내 두뇌가 뒤 틀렸다.

+1

'df.loc [df [ 'x'] <-0.6, 'x'] = np.nan' – IanS

+0

나는'df.filter (...) .groupby ('id'). mean()'은 원하는 것을 얻는 가장 효율적인 방법입니다. – jonchar

답변

1

당신은 GROUPBY apply 기능을 사용하여이를 수행 할 수 있습니다 : 여기

def mean_cond(dfg): 
    if dfg['x'].count() >= 3: 
     return dfg.mean() 
    return None 

print df.groupby('id').apply(mean_cond).dropna() 

장점은 그룹화 과정이 필터 후 다른 GROUPBY을 실행하는 것보다 더 효율적으로 될 수있는 한 번만 수행된다는 점이다. 유일한 문제는 결과적으로 결과 테이블에 NaN으로 표시되는 조건을 충족하지 않는 그룹을 만듭니다. 이는 결국 dropna 명령을 추가하여 쉽게 해결할 수 있습니다.