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

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

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


当前回答

您可以使用dfsql 对于你的问题,它看起来像这样:

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

https://github.com/mindsdb/dfsql

这里有一篇关于它的文章:

https://medium.com/riselab/why-every-data-scientist-using-pandas-needs-modin-bringing-sql-to-dataframes-3b216b29a7c0

其他回答

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

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

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

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

运用你的价值观……

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

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

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

or

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

你也可以使用agg函数,

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

如果你想让聚合列有一个自定义的名称,如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 dataframe。它不是Pandas的一部分,所以必须单独安装。

#! pip install pandasql
from pandasql import sqldf
sqldf("""
SELECT Fruit, Name, sum(Number) AS Total
FROM df 
GROUP BY Fruit, Name
""")