Gấu trúc nhóm và tổng


206

Tôi đang sử dụng khung dữ liệu này:

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

Tôi muốn tổng hợp điều này theo tên và sau đó bằng trái cây để có được tổng số trái cây cho mỗi tên.

Bob,Apples,16 ( for example )

Tôi đã thử nhóm theo Tên và Trái cây nhưng làm cách nào để có được tổng số trái cây.

Câu trả lời:


210

Sử dụng 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

95
Làm thế nào gấu trúc có thể biết rằng tôi muốn tổng hợp col có tên Number?
Tên vua

12
@Kingname đó là cột cuối cùng còn lại nếu bạn lấy ra TÊN và TRÁI CÂY. nếu bạn thêm 2 cột còn lại, nó sẽ tổng hợp cả hai cột
Steven G

9
Làm thế nào để xác định cột nào để tổng hợp?
tgdn

35
@tgdn df.groupby (['Tên', 'Trái cây']) ['Số']. sum ()
Steven G

2
@StevenG Đối với câu trả lời được cung cấp để tổng hợp một cột cụ thể, đầu ra xuất hiện dưới dạng một chuỗi Pandas thay vì Dataframe. Từ nhận xét của Jakub Kukul (trong câu trả lời dưới đây), chúng ta có thể sử dụng dấu ngoặc vuông đôi xung quanh 'Số' để lấy Dataframe.
skdhfgeq2134

179

Ngoài ra, bạn có thể sử dụng chức năng agg,

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

1
Điều này khác với câu trả lời được chấp nhận ở chỗ câu trả lời này Seriestrong khi câu trả lời khác trả về một GroupByđối tượng.
Gaurang Tandon

11
@GaurangTandon để lấy DataFrameđối tượng thay thế (như trong câu trả lời được chấp nhận), sử dụng dấu ngoặc vuông đôi xung quanh 'Number', tức là:df.groupby(['Name', 'Fruit'])[['Number']].agg('sum')
Jakub Kukul

1
Rất hữu ích trong việc làm sạch báo cáo truy vấn được mã hóa xấu.
avirr

93

Nếu bạn muốn giữ các cột ban đầu FruitName, sử dụng reset_index(). Nếu không FruitNamesẽ trở thành một phần của chỉ số.

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

Như đã thấy trong các câu trả lời khác:

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

Cả hai câu trả lời khác đều hoàn thành những gì bạn muốn.

Bạn có thể sử dụng pivotchức năng để sắp xếp dữ liệu trong một bảng đẹp

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()

Bạn có thể chọn các cột khác nhau để tính tổng số.


7

Bạn có thể đặt groupbycột index sau đó sử dụng sumvớilevel

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

Một biến thể của hàm .agg (); cung cấp khả năng (1) Kiểu dữ liệu bền vững, (2) áp dụng mức trung bình, số đếm, tổng, v.v. và (3) cho phép nhóm trên nhiều cột trong khi duy trì mức độ dễ đọc.

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

sử dụng các giá trị của bạn ...

df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.