如何使用 Pandas group-by 来获取总和?
- 2024-11-18 08:41:00
- admin 原创
- 13
问题描述:
我正在使用这个数据框:
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
我想将其聚合起来Name
,然后得到Fruit
总数。例如:Fruit
`Name`
Bob,Apples,16
我尝试按Name
和分组,Fruit
但如何得到总数Fruit
?
解决方案 1:
使用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(['Name', 'Fruit'])['Number'].sum()
解决方案 2:
你也可以使用 agg 函数,
df.groupby(['Name', 'Fruit'])['Number'].agg('sum')
解决方案 3:
如果要保留原有的列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
解决方案 4:
其他两个答案都可以实现您的要求。
您可以使用该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
解决方案 5:
df.groupby(['Fruit','Name'])['Number'].sum()
您可以选择不同的列来求和。
解决方案 6:
.agg() 函数的变体;提供以下功能:(1)持久化 DataFrame 类型;(2)应用平均值、计数、求和等;(3)在保持易读性的同时对多列进行分组。
df.groupby(['att1', 'att2']).agg({'att1': "count", 'att3': "sum",'att4': 'mean'})
使用你的价值观...
df.groupby(['Name', 'Fruit']).agg({'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
解决方案 8:
您还可以在 group by 之后使用transform()
on 列Number
。此操作将使用函数计算一组中的总数sum
,结果是与原始数据框具有相同索引的系列。
df['Number'] = df.groupby(['Fruit', 'Name'])['Number'].transform('sum')
df = df.drop_duplicates(subset=['Fruit', 'Name']).drop('Date', 1)
然后,您可以删除列Fruit
和上的重复行。此外,您可以通过指定轴(对于行,对于列)Name
删除列。Date
`10
1`
# 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'))
有一个官方教程Group by: split-apply-combine讨论了 group by 之后可以做什么。
解决方案 9:
如果您希望聚合列具有自定义名称(如Total Number
等Total
)(此处的所有解决方案都会生成一个数据框,其中聚合列名为Number
),请使用命名聚合:
df.groupby(['Fruit', 'Name'], as_index=False).agg(**{'Total Number': ('Number', 'sum')})
或者(如果自定义名称中不需要有空格):
df.groupby(['Fruit', 'Name'], as_index=False).agg(Total=('Number', 'sum'))
这相当于 SQL 查询:
SELECT Fruit, Name, sum(Number) AS Total
FROM df
GROUP BY Fruit, Name
说到 SQL,有pandasql
一个模块允许您使用 SQL 语法在本地环境中查询 pandas dataFrames。它不是 Pandas 的一部分,因此必须单独安装。
#! pip install pandasql
from pandasql import sqldf
sqldf("""
SELECT Fruit, Name, sum(Number) AS Total
FROM df
GROUP BY Fruit, Name
""")
解决方案 10:
您可以使用 reset_index() 在求和后重置索引
df.groupby(['Fruit','Name'])['Number'].sum().reset_index()
或者
df.groupby(['Fruit','Name'], as_index=False)['Number'].sum()
解决方案 11:
您可以使用 dfsql
来解决您的问题,它看起来像:
df.sql('SELECT fruit, sum(number) GROUP BY fruit')
https://github.com/mindsdb/dfsql
这是一篇关于它的文章:
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件