2017-01-05 3 views
3

다음과 같이 그룹화 논리를 자세히 설명하고자합니다.평균 및 개수가있는 조건부 그룹화

df = 

    ID GROUP DAY GRADE TIME_1 
    1 AAA 1 5  20 
    1 AAA 1 4  19 
    1 AAA 1 3  21 
    1 BBB 2 1  10 
    2 BBB 2 3  13 

내가 ID, GRADE, GROUPDAY으로 그룹 행에 필요하고, 그룹에서 행의 수를 평균 TIME_1을 계산하십시오 dataframe df을 감안할 때. 또한 (그리고 이것이 내 질문입니다) GRADE이 4 또는 5인지 확인하고 싶다면 긍정적 인 등급으로 그룹화해야하며 TIME_1을 계산해야합니다. 그렇지 않으면 -를 음수로 계산해야합니다.

결과는해야이 하나

result = 

    GROUP DAY AVG_TIME_1_POSITIVE AVG_TIME_1_NEGATIVE QTY_POSITIVE QTY_NEGATIVE 
    AAA 1 19.5     21     2    1 
    BBB 2 0     11.5     0    2 

나는이 방법을 사용하지만, GRADE에 의해 그룹화 조건을 지정하는 방법을 모른다 :

result = df.groupby(['GROUP','GRADE','DAY']).agg({'TIME_1': 'mean', 
        'ID': 'count'}).reset_index() 

답변

2

한 가지 가능한 솔루션입니다 boolean indexingconcat :

mask = df.GRADE.isin([4,5]) 
result1 = df[mask].groupby(['GROUP','DAY']).agg({'TIME_1': 'mean', 
        'ID': 'count'}).add_suffix('_POSITIVE') 

print (result1) 
      TIME_1_POSITIVE ID_POSITIVE 
GROUP DAY        
AAA 1    19.5   2 

result2 = df[~mask].groupby(['GROUP','DAY']).agg({'TIME_1': 'mean', 
        'ID': 'count'}).add_suffix('_NEGATIVE') 

print (result2) 
      TIME_1_NEGATIVE ID_NEGATIVE 
GROUP DAY        
AAA 1    21.0   1 
BBB 2    11.5   2 

print (pd.concat([result1, result2], axis=1)) 
      TIME_1_POSITIVE ID_POSITIVE TIME_1_NEGATIVE ID_NEGATIVE 
GROUP DAY                
AAA 1    19.5   2.0    21.0   1 
BBB 2    NaN   NaN    11.5   2 
+0

하드 질문입니다. 'print (type (mask))'-'Series'입니까? – jezrael

2

당신은 c 수동으로 분할해야 적용하고 GROUPBY을 사용 한 후 분할 apply-을 어떻게해야되는합니다 (dataframe를 결합하는 경우는 나에게

qty_pos = df.groupby(['GROUP','GRADE','DAY']).agg({'GRADE': lambda x: sum(x>3)}) 
qty_neg = df.groupby(['GROUP','GRADE','DAY']).agg({'GRADE': lambda x: sum(x<=3)}) 
result['QTY_POSITIVE'] = qty_pos 
result['QTY_NEGATIV'] = qty_neg 
0

처럼 agg 뭔가 기능을 통과, 그것은 파이썬 아니다 우리를 위해 직업을 합치십시오). 그래서 문제는 그룹화 할 데이터 프레임의 적절한 키를 공식화하는 방법이라고 생각합니다.

입력 :

df=df.set_index(['GROUP','DAY', 'GRADE'],drop=False) 
key=lambda x: (x[0],x[1], 'positive' if x[2] in [4,5] else 'negative') 
df.groupby(key).agg({'TIME_1': 'mean', 'ID': 'count'}) 

출력 : 데이터없이

    TIME_1 ID 
(AAA, 1, negative) 21.0 1 
(AAA, 1, positive) 19.5 2 
(BBB, 2, negative) 11.5 2