我正在使用此数据框:
#wrapper1{
width: 85%;
margin-left: auto;
margin-right: auto;
font-family: Helvetica, Verdana, Arial;
}
#header {
width: 100%;
position: relative;
}
#logo {
height: 450px;
width: 100%;
}
#logo img {
height: 100%;
width: 100%;
}
#login {
bottom: 0px;
right: 0px;
width: 15%;
color: white;
position: absolute;
}
#login a {
color: inherit
}
#register {
font-size: 14px;
}
#login fieldset {
display: block;
border: 2px solid white;
}
#sidebar {
margin: 14px;
width: 100%;
}
#sidebar a {
height: 40px;
padding-top: 10px;
padding-left: 6.55%;
padding-right: 6.55%;
text-align: center;
font-size: 12pt;
font-weight: bold;
background-color: black;
color: white;
border-style: outset;
border-width: 1px;
text-decoration: none;
}
我希望按名称汇总,然后按水果汇总,以获得每个名字的水果总数。
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
我尝试按名称和水果分组,但我如何获得水果总数。
答案 0 :(得分:105)
使用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
答案 1 :(得分:100)
你也可以使用agg功能
df.groupby(['Name', 'Fruit'])['Number'].agg('sum')
答案 2 :(得分:31)
如果要保留原始列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
答案 3 :(得分:22)
其他答案都能达到你想要的效果。
您可以使用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
答案 4 :(得分:12)
df.groupby(['Fruit','Name'])['Number'].sum()
您可以选择不同的列来汇总数字。
答案 5 :(得分:8)
.agg()函数的变体;提供以下功能:(1)持久化类型DataFrame,(2)应用平均值,计数,求和等,以及(3)在保持易读性的同时在多个列上启用groupby。
df.groupby(['att1', 'att2']).agg({'att1': "count", 'att3': "sum",'att4': 'mean'})
使用您的值...
df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
答案 6 :(得分:6)
您可以使用groupby
和sum
:
df.groupby(['Name', 'Fruit']).sum()
Number
Name Fruit
Bob Apples 16
Grapes 35
Oranges 67
Mike Apples 9
Oranges 57
Steve Apples 10
Tom Grapes 87
Oranges 15
Tony Grapes 15
Oranges 1
答案 7 :(得分:4)
您也可以在 group by 之后在列 Number
上使用 transform()。此操作将使用函数 sum
计算一组中的总数,结果是与原始数据帧具有相同索引的序列。
df['Number'] = df.groupby(['Fruit', 'Name'])['Number'].transform('sum')
df = df.drop_duplicates(subset=['Fruit', 'Name']).drop('Date', 1)
然后,您可以删除列 Fruit
和 Name
上的重复行。此外,您可以通过指定轴 Date
(1
表示行,0
表示列)来删除列 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 讨论了分组后可以做什么。
答案 8 :(得分:1)
此答案仅是为了了解groupby和sum的工作原理。
我正在使用数据集“从1900年到2015年在印度的降雨”
“我的数据集”包括“细分”和“年度”之类的列。
因此,在这里,我想计算每个分区的年降雨量总和。
Total = Data.groupby('SUBDIVISION')['ANNUAL'].sum()
print (Total)
这是细分的分组方式,我们将获得每个细分的年降雨量总和。
答案 9 :(得分: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
答案 10 :(得分:0)
你可以使用dfsql
对于您的问题,它看起来像:
df.sql('SELECT fruit, sum(number) GROUP BY fruit')
https://github.com/mindsdb/dfsql
这是一篇关于它的文章: