我正在使用这个数据框架:
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
我尝试按名称和水果分组,但我如何得到水果的总数?
如果你想保留原来的列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
.agg()函数的变体;提供了(1)持久化类型DataFrame的能力,(2)应用平均值,计数,总和等,(3)在保持易读性的同时,在多个列上启用分组。
df.groupby(['att1', 'att2']).agg({'att1': "count", 'att3': "sum",'att4': 'mean'})
运用你的价值观……
df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
也可以在group by后面的列Number上使用transform()。该操作将用函数和计算一个组中的总数,结果是一个与原始数据帧具有相同索引的序列。
df['Number'] = df.groupby(['Fruit', 'Name'])['Number'].transform('sum')
df = df.drop_duplicates(subset=['Fruit', 'Name']).drop('Date', 1)
然后,可以删除Fruit列和Name列上的重复行。此外,您可以通过指定轴1(0表示行,1表示列)来删除列Date。
# 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之后可以做什么。
如果你想让聚合列有一个自定义的名称,如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
""")