2016-06-06 2 views
3

의 쿼리가 표시됩니다. select id, avg(x), avg(y), max(x), max(y) from table group by id 팬더 데이터 프레임에서 단일 연산으로 변환 할 수 있습니까? 내가결과에 여러 열이있는 여러 열에 연산을 적용하면 SQL에

mydf['center_x'] = mydf.groupby('id')['x'].mean() 
mydf['center_y'] = mydf.groupby('id')['y'].mean() 

같이 각 기능의 결과를 얻을 수 있지만이 같은 작업의 과도한 호출, 플러스 과도한 스토리지 수요의 (mydf은 거대하다). 마지막에는 고유 한 세트를 얻는 것이 번거로롭다.

아이디어가 있으십니까?

+0

'agg'은 분명히 대답이지만 귀하의 마지막 진술에 관한 것입니다. group ('g = df.groupby ('id')')를 호출하고 필요할 때 함수를 호출하면 ('g [ 'x'], mean()'등), 매번 그룹화 할 필요가 없다 – ayhan

답변

4

예, 지원됩니다. here 문서를 참조하십시오.

거기에서 인용하려면 :

질문에
In [56]: grouped = df.groupby('A') 

In [57]: grouped['C'].agg([np.sum, np.mean, np.std]) 
Out[57]: 
      sum  mean  std 
A         
bar 0.443469 0.147823 0.301765 
foo 2.529056 0.505811 0.966450 

어쩌면 더 관련, 당신은 또한 다른 컬럼에 대해 서로 다른 기능을 할 수 있도록 같은 : 더 가까이에

In [60]: grouped.agg({'C' : np.sum, 
    ....:    'D' : lambda x: np.std(x, ddof=1)}) 
    ....: 
Out[60]: 
      C   D 
A      
bar 0.443469 1.490982 
foo 2.529056 0.645875 

또는 실제 예 귀하의 원래 질문 :

df = pd.DataFrame({"group":list("aaaaabbbbb"), "A":np.random.rand(10), "B":np.random.rand(10)}) 
df.groupby("group").agg({"A":[np.sum, np.mean], "B":[np.sum, np.mean]}) 


    A    B 
    sum  mean sum  mean 
group    
a 1.450488 0.290098 3.526962 0.705392 
b 1.570386 0.314077 2.734465 0.546893 
+0

감사합니다. Nils, 같은 열에 적용된 여러 기능을 결합 할 수있는 것처럼 보입니다. 그러나 원래 예제의 x와 y에 대해 나는 여전히 두 개의 선택이 필요하다. 그리고 나서 그것들을 결합하거나 그것만이 될 수 있을까? – cur4so

+0

잘 모르겠다 - 두 번째 예제가하는 것이 아닌가요? 나는. C 열에 함수를 적용하고 D 열에는 하나의 함수를 적용 하시겠습니까? –

+0

은 C 열에 2 개, D 열에 2 개의 함수를 포함 할 수 있습니까? 2 가지 예를 조합하여 만들 수 있습니까? 한 열의 평균 및 최대 값 및 한 열의 평균 및 최대 값. 두 번째 예제에서 'C'와 'D'는 입력 및 출력 열이되거나 출력에서 ​​어떻게 든 이름이 변경되어야합니다. – cur4so