Python 熊猫分组和总和

Python 熊猫分组和总和,python,pandas,dataframe,group-by,aggregate,Python,Pandas,Dataframe,Group By,Aggregate,我正在使用此数据框: 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 M

我正在使用此数据框:

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 )
我尝试按名称和水果分组,但如何获得水果总数。

使用:


其他两个答案都能满足你的要求

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

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

您可以选择不同的列对数字求和

如果要保留原始列
Fruit
Name
,请使用
reset\u index()
。否则
水果
名称
将成为索引的一部分

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

您可以将
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
.agg()函数的变体;提供以下功能:(1)持久化类型数据帧;(2)应用平均值、计数、求和等;(3)在保持易读性的同时启用多列groupby

df.groupby(['att1', 'att2']).agg({'att1': "count", 'att3': "sum",'att4': 'mean'})
用你的价值观

df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
您还可以在分组依据后的列上使用。此操作将使用函数
sum
计算一组中的总数,结果是一个与原始数据帧具有相同索引的序列

df['Number']=df.groupby(['Fruit','Name'])['Number'].transform('sum')
df=df.drop_重复项(子集=['Fruit','Name'])。drop('Date',1)
然后,您可以将重复的行放在列
Fruit
Name
上。此外,可以通过指定轴
1
(行为
0
,列为
1
)来删除列
Date

有一个官方教程讨论分组后可以做什么。

您可以使用dfsql
对于您的问题,它将类似于:

df.sql('SELECT fruit, sum(number) GROUP BY fruit')

以下是一篇关于它的文章:


熊猫怎么知道我要对名为
数字的列求和?@Kingname如果去掉NAME和FRUIT,这是最后一列了。如果您在左侧添加2列,它将对两列进行求和以指定要求和的列?@tgdn df.groupby(['Name','Fruit'])['Number'].sum()@steven对于提供的用于对特定列求和的答案,输出将作为一个系列而不是数据帧。根据Jakub Kukul的评论(在下面的答案中),我们可以在“Number”周围使用双方括号来获取数据帧。这与公认的答案不同,因为它返回一个
系列
,而另一个返回一个
GroupBy
对象。@GaurangTandon以获取
数据帧
对象(类似于公认的答案),在
'Number'
周围使用双方括号,即:
df.groupby(['Name','Fruit'])[['Number']].agg('sum')
非常有助于清理编码错误的查询报告。非常有帮助-谢谢。这是对我来说最有用的答案!您可以使用dfsql df.sql('按水果选择水果、总和(数字)分组')
df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
# print(df)

      Fruit   Name  Number
0    Apples    Bob      16
2    Apples   Mike       9
3    Apples  Steve      10
5   Oranges    Bob      67
6   Oranges    Tom      15
7   Oranges   Mike      57
9   Oranges   Tony       1
10   Grapes    Bob      35
11   Grapes    Tom      87
14   Grapes   Tony      15

# You could achieve the same result with functions discussed by others: 
# print(df.groupby(['Fruit', 'Name'], as_index=False)['Number'].sum())
# print(df.groupby(['Fruit', 'Name'], as_index=False)['Number'].agg('sum'))
df.sql('SELECT fruit, sum(number) GROUP BY fruit')