2017-09-12 1 views
1

의 합이 내 데이터입니다 :GROUPBY 조건 및 계산 여기에 하위 그룹

import numpy as np 
import pandas as pd 
z = pd.DataFrame({'a':[1,1,1,2,2,3,3],'b':[3,4,5,6,7,8,9], 'c':[10,11,12,13,14,15,16]}) 
z 

    a b c 
0 1 3 10 
1 1 4 11 
2 1 5 12 
3 2 6 13 
4 2 7 14 
5 3 8 15 
6 3 9 16 

질문 :

어떻게 각 하위 그룹의 다른 요소에 대한 계산을 할 수 있습니까? 예를 들어 각 그룹에 대해 열 'b'의 해당 요소가 4와 9 사이에있는 'c'열의 요소를 모두 추출하려고합니다. 여기

내가 쓴 코드입니다 : (그것은 실행하지만 정확한 결과를 얻을 수 없다) 출력 결과가 같은 것을해야한다

gbz = z.groupby('a') 
# For displaying the groups: 
gbz.apply(lambda x: print(x)) 


list = [] 

def f(x): 
    list_new = [] 
    for row in range(0,len(x)): 
     if (x.iloc[row,0] > 4 and x.iloc[row,0] < 9): 
      list_new.append(x.iloc[row,1]) 
    list.append(sum(list_new)) 

results = gbz.apply(f) 

:

a c 
0 1 12 
1 2 27 
2 3 15 
+0

사용할 수 있습니다. [이 비교] (https://pandas.pydata.org/pandas-docs/stable/comparison_with_sql.html)는 SQL이 무엇인지 모르더라도 SQL로 도움을 줄 수 있습니다. – dangom

+0

@ 단국. 감사. – Saeed

답변

3

것은 그냥 쉬운 수 있습니다 작업 순서를 변경하고 먼저 기준에 따라 필터링하십시오. groupby 이후에는 변경되지 않습니다.

a c 
0 1 12 
1 2 27 
2 3 15 
+0

이 답변이 잘못 되었습니까? –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ 아, 나는 그들이 인덱스에서 1 초가 아닌'a'를 원한다는 것을 보지 못했습니다. – miradulo

+1

'z.query ('4 Zero

2

사용

In [2379]: z[z.b.between(4, 9, inclusive=False)].groupby('a', as_index=False).c.sum() 
Out[2379]: 
    a c 
0 1 12 
1 2 27 
2 3 15 

또는

In [2384]: z[(4 < z.b) & (z.b < 9)].groupby('a', as_index=False).c.sum() 
Out[2384]: 
    a c 
0 1 12 
1 2 27 
2 3 15 
+0

Op는 그룹을 언급하고 있습니다 ... 나는 groupby와 vs가 합쳐지기 전에 합계를 출력하는 것과 차이가 있을지 어떨지 궁금합니다. –

1

당신은 수 또한 groupby 첫째을 산출

z.query('4 < b < 9').groupby('a', as_index=False).c.sum() 

.

z = z.groupby('a').apply(lambda x: x.loc[x['b']\ 
      .between(4, 9, inclusive=False), 'c'].sum()).reset_index(name='c') 
z 

    a c 
0 1 12 
1 2 27 
2 3 15 
1

또는 당신은

z.groupby('a').apply(lambda x : sum(x.loc[(x['b']>4)&(x['b']<9),'c']))\ 
      .reset_index(name='c') 
Out[775]: 
    a c 
0 1 12 
1 2 27 
2 3 15 
이 문서를 읽고에 의해 시작