นุ่นกลุ่มและผลรวม


206

ฉันใช้เฟรมข้อมูลนี้:

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 )

ฉันพยายามจัดกลุ่มตามชื่อและผลไม้ แต่ฉันจะได้รับผลรวมได้อย่างไร

คำตอบ:


210

การใช้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
วิธีสามารถนุ่นรู้ว่าผมต้องการที่จะสรุปเทือกเขาชื่อNumber?
Kingname

12
@Kingname เป็นคอลัมน์สุดท้ายที่เหลือหากคุณนำ NAME และ FRUIT ออก หากคุณบวก 2 คอลัมน์ที่เหลือจะรวมทั้งสองคอลัมน์
Steven G

9
จะระบุคอลัมน์ที่จะรวมได้อย่างไร
tgdn

35
@tgdn df.groupby (['ชื่อ', 'ผลไม้']) ['จำนวน']. ผลรวม ()
Steven G

2
@StevenG สำหรับคำตอบที่ให้ไว้เพื่อสรุปคอลัมน์ที่เฉพาะเจาะจงเอาต์พุตจะออกมาเป็นซีรีส์ Pandas แทน Dataframe จากความคิดเห็นของ Jakub Kukul (ในคำตอบด้านล่าง) เราสามารถใช้วงเล็บสองช่องรอบ ๆ 'Number' เพื่อรับ Dataframe
skdhfgeq2134

178

นอกจากนี้คุณสามารถใช้ฟังก์ชัน agg

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

1
สิ่งนี้แตกต่างจากคำตอบที่ยอมรับซึ่งจะส่งกลับค่าSeriesในขณะที่อีกคำตอบส่งคืนGroupByวัตถุ
Gaurang Tandon

11
@GaurangTandon เพื่อให้ได้DataFrameวัตถุแทน (เช่นในคำตอบที่ยอมรับ) ให้ใช้วงเล็บเหลี่ยมสองอันรอบ ๆ'Number'เช่น:df.groupby(['Name', 'Fruit'])[['Number']].agg('sum')
Jakub Kukul

1
มีประโยชน์มากในการล้างรายงานแบบสอบถามที่เข้ารหัสไม่ดี
avirr

92

หากคุณต้องการที่จะเก็บคอลัมน์เดิมFruitและการใช้งานName reset_index()มิฉะนั้นFruitและNameจะกลายเป็นส่วนหนึ่งของดัชนี

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) ชนิดข้อมูลคงอยู่, (2) ใช้ค่าเฉลี่ย, นับ, การสรุปและอื่น ๆ (3) เปิดใช้งาน groupby ในหลายคอลัมน์ในขณะที่รักษาความชัดเจน

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.