我正在使用这个数据框架:

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

我尝试按名称和水果分组,但我如何得到水果的总数?


当前回答

可以使用reset_index()重置求和之后的索引

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

or

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

其他回答

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

您可以选择不同的列来求和。

使用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

要指定要求和的列,使用:df。groupby([“名称”,“水果”])(“数量”).sum ()

你可以将groupby列设置为index,然后使用sum with 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

其他两个答案都达到了你想要的效果。

您可以使用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

.agg()函数的变体;提供了(1)持久化类型DataFrame的能力,(2)应用平均值,计数,总和等,(3)在保持易读性的同时,在多个列上启用分组。

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

运用你的价值观……

df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})