2013-02-24 2 views
3

나는 (iris 데이터 세트와 예) 다음의 열 중 하나에 의해 내 dataframe을 그룹화하고 있습니다 :Python pandas에서 그룹화 된 데이터 프레임에 함수를 적용하는 방법은 무엇입니까?

grouped_iris = iris.groupby(by="Name") 
내가 grouped_iris의 열 부분 집합을 특정 무언가를 그룹별로 기능을 적용 할 것

. 각 그룹 (각 값 Name)에 대해 PetalLengthPetalWidth의 합계를 적용하고 SumLengthWidth이라는 새 열에 넣는 함수를 어떻게 적용 할 수 있습니까? 하지만 내가 찾는 것은 이것에 트위스트가

grouped_iris.agg(sum) 

: 나는이 같은 agg와 함께 그룹별로 모든 열을 합 수 있다는 사실을 알고 대신 각 열에 대해 특정 Name의 모든 항목을 합산의 I 각 Name 그룹에 대해 열의 하위 집합 (SepalWidth, SepalLength)을 합산하려고합니다. 감사.

답변

2
당신이 (이 경우에는 앤디의 솔루션은 당신이 원하는) 집계 번호를 원하는 경우

는 말할 수 없다, 또는 경우에 당신이 그것을 다시 전환하려면 원래의 데이터 프레임에 추가합니다. 이 후자의 경우 transform

In [33]: cols = ['PetalLength', 'PetalWidth'] 

In [34]: transformed = grouped_iris[cols].transform(sum).sum(axis=1) 

In [35]: iris['SumLengthWidth'] = transformed 

In [36]: iris.head() 
Out[36]: 
    SepalLength SepalWidth PetalLength PetalWidth   Name SumLengthWidth 
0   5.1   3.5   1.4   0.2 Iris-setosa   85.4 
1   4.9   3.0   1.4   0.2 Iris-setosa   85.4 
2   4.7   3.2   1.3   0.2 Iris-setosa   85.4 
3   4.6   3.1   1.5   0.2 Iris-setosa   85.4 
4   5.0   3.6   1.4   0.2 Iris-setosa   85.4 

편집 사용할 수 있습니다 sum으로 GROUPBY를 집계하는 dataframe df을 위해 일반적으로 일반적인 경우의 예를

것은, 당신에게 각 그룹의 합계를 제공

In [47]: df 
Out[47]: 
    Name val1 val2 
0 foo  6  3 
1 bar 17  4 
2 foo 16  6 
3 bar  7  3 
4 foo  6 13 
5 bar  7  1 

In [48]: grouped = df.groupby('Name') 

In [49]: grouped.agg(sum) 
Out[49]: 
     val1 val2 
Name    
bar  31  8 
foo  28 22 

귀하의 경우 행 전체에서 이들을 합산하는 데 관심이 있습니다 :

In [50]: grouped.agg(sum).sum(axis=1) 
Out[50]: 
Name 
bar  39 
foo  50 

하지만 두 개의 숫자 만 제공합니다. 각 그룹당 1. 당신이 원래 dataframe에 다시 투영 된 두 숫자를 원하는 경우 일반적으로, 당신은 transform를 사용하려면 :

In [51]: grouped.transform(sum) 
Out[51]: 
    val1 val2 
0 28 22 
1 31  8 
2 28 22 
3 31  8 
4 28 22 
5 31  8 

공지 사항이 값은 agg, 하지만에 의해 생성 된 값과 정확히 동일 어떻게 원래 치수가 df입니다. 행 [0, 2, 4]와 [1, 3, 5]가 동일한 그룹이므로 다른 모든 값이 반복되는 방법에 유의하십시오. 귀하의 경우에는 두 값의 합계가 필요하므로 행 전체에서 이것을 합산하십시오.

In [52]: grouped.transform(sum).sum(axis=1) 
Out[52]: 
0 50 
1 39 
2 50 
3 39 
4 50 
5 39 

당신이 컬럼으로 다시 할당 (또는 당신이 그것으로 좋아하는 일을 할) 수 있도록 지금, 원래 dataframe과 같은 길이의 시리즈를 가지고 :

In [53]: df['val1 + val2 by Name'] = grouped.transform(sum).sum(axis=1) 

In [54]: df 
Out[54]: 
    Name val1 val2 val1 + val2 by Name 
0 foo  6  3     50 
1 bar 17  4     39 
2 foo 16  6     50 
3 bar  7  3     39 
4 foo  6 13     50 
5 bar  7  1     39 
+0

당신은 더 설명 할 수 'grouped_iris [cols] .transform (sum)'이 정확히 여기에서하고 있으며'transform'이 일반적으로 어떻게 사용 되는가? 나는 그것의 문서를보고 나서 아직도 혼란 스럽다. 감사. – user248237dfsf

+0

그게 더 명확합니까? – beardc

2

이 다소 세련 보이지만 작업을 수행합니다

grouped_iris[['PetalLength', 'PetalWidth']].sum().sum(axis=1) 
관련 문제