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