팬더 그룹 및 합계


205

이 데이터 프레임을 사용하고 있습니다 :

Fruit   Date      Name  Number
Apples  10/6/2016 Bob    7
Apples  10/6/2016 Bob    8
Apples  10/6/2016 Mike   9
Apples  10/7/2016 Steve 10
Apples  10/7/2016 Bob    1
Oranges 10/7/2016 Bob    2
Oranges 10/6/2016 Tom   15
Oranges 10/6/2016 Mike  57
Oranges 10/6/2016 Bob   65
Oranges 10/7/2016 Tony   1
Grapes  10/7/2016 Bob    1
Grapes  10/7/2016 Tom   87
Grapes  10/7/2016 Bob   22
Grapes  10/7/2016 Bob   12
Grapes  10/7/2016 Tony  15

이름별로 과일을 집계하여 과일별로 총 과일 수를 얻으려고합니다.

Bob,Apples,16 ( for example )

나는 이름과 과일로 그룹화를 시도했지만 어떻게 총 과일 수를 얻습니까?

답변:


209

사용 GroupBy.sum:

df.groupby(['Fruit','Name']).sum()

Out[31]: 
               Number
Fruit   Name         
Apples  Bob        16
        Mike        9
        Steve      10
Grapes  Bob        35
        Tom        87
        Tony       15
Oranges Bob        67
        Mike       57
        Tom        15
        Tony        1

94
팬더는 내가 col이라는 이름을 합치고 싶다는 것을 어떻게 알 수 Number있습니까?
Kingname

12
@Kingname NAME과 FRUIT를 꺼내면 마지막으로 남은 열입니다. 왼쪽에 2 개의 열을 추가하면 두 열을 합산합니다.
Steven G

9
합계 할 열을 지정하는 방법은 무엇입니까?
tgdn

34
@tgdn df.groupby ([ 'Name', 'Fruit']) [ 'Number']. sum ()
Steven G

2
@StevenG 특정 열을 요약하기 위해 제공된 답변의 경우 데이터 프레임 대신 팬더 시리즈로 출력이 나옵니다. Jakub Kukul (아래 답변)의 의견에서 'Number'주위에 이중 대괄호를 사용하여 데이터 프레임을 얻을 수 있습니다.
skdhfgeq2134

178

또한 agg 기능을 사용할 수 있습니다.

df.groupby(['Name', 'Fruit'])['Number'].agg('sum')

1
이것은 a를 반환 Series하고 다른 하나는 GroupBy객체를 반환 한다는 점에서 허용되는 대답과 다릅니다 .
Gaurang Tandon

11
@GaurangTandon DataFrame대신 객체 를 얻으려면 (답변과 같이) 이중 대괄호를 사용하십시오 'Number'.df.groupby(['Name', 'Fruit'])[['Number']].agg('sum')
Jakub Kukul

1
잘못 인코딩 된 쿼리 보고서를 정리하는 데 매우 유용합니다.
avirr

92

원래 열을 유지하려면 FruitName을 사용하십시오 reset_index(). 그렇지 않으면 FruitName인덱스의 일부가 될 것입니다.

df.groupby(['Fruit','Name'])['Number'].sum().reset_index()

Fruit   Name       Number
Apples  Bob        16
Apples  Mike        9
Apples  Steve      10
Grapes  Bob        35
Grapes  Tom        87
Grapes  Tony       15
Oranges Bob        67
Oranges Mike       57
Oranges Tom        15
Oranges Tony        1

다른 답변에서 볼 수 있듯이 :

df.groupby(['Fruit','Name'])['Number'].sum()

               Number
Fruit   Name         
Apples  Bob        16
        Mike        9
        Steve      10
Grapes  Bob        35
        Tom        87
        Tony       15
Oranges Bob        67
        Mike       57
        Tom        15
        Tony        1

43

다른 답변 모두 원하는 것을 달성합니다.

pivot기능을 사용하여 멋진 테이블에 데이터를 정렬 할 수 있습니다

df.groupby(['Fruit','Name'],as_index = False).sum().pivot('Fruit','Name').fillna(0)



Name    Bob     Mike    Steve   Tom    Tony
Fruit                   
Apples  16.0    9.0     10.0    0.0     0.0
Grapes  35.0    0.0     0.0     87.0    15.0
Oranges 67.0    57.0    0.0     15.0    1.0

19
df.groupby(['Fruit','Name'])['Number'].sum()

다른 열을 선택하여 숫자를 합할 수 있습니다.


7

당신은 설정할 수 있습니다 groupby에 열을 index 다음 사용 sum하여level

df.set_index(['Fruit','Name']).sum(level=[0,1])
Out[175]: 
               Number
Fruit   Name         
Apples  Bob        16
        Mike        9
        Steve      10
Oranges Bob        67
        Tom        15
        Mike       57
        Tony        1
Grapes  Bob        35
        Tom        87
        Tony       15

3

.agg () 함수의 변형; (1) 유형 DataFrame을 유지하고, (2) 평균, 개수, 합계 등을 적용하고, (3) 가독성을 유지하면서 여러 열을 그룹화 할 수있는 기능을 제공합니다.

df.groupby(['att1', 'att2']).agg({'att1': "count", 'att3': "sum",'att4': 'mean'})

당신의 가치를 사용하여 ...

df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.