Try*_*ard 136 python group-by aggregate dataframe pandas
我正在使用这个数据框:
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
Run Code Online (Sandbox Code Playgroud)
我希望通过名称然后通过水果来汇总这个,以获得每个名字的水果总数.
Bob,Apples,16 ( for example )
Run Code Online (Sandbox Code Playgroud)
我尝试按名称和水果分组,但我如何获得水果总数.
Ste*_*n G 147
使用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
Run Code Online (Sandbox Code Playgroud)
Sau*_*abh 137
你也可以使用agg功能,
df.groupby(['Name', 'Fruit'])['Number'].agg('sum')
Run Code Online (Sandbox Code Playgroud)
小智 59
如果您想保留原始列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
Run Code Online (Sandbox Code Playgroud)
如其他答案所示:
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
Run Code Online (Sandbox Code Playgroud)
Dem*_*nos 33
其他答案都能达到你想要的效果.
您可以使用该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
Run Code Online (Sandbox Code Playgroud)
小智 14
df.groupby(['Fruit','Name'])['Number'].sum()
Run Code Online (Sandbox Code Playgroud)
您可以选择不同的列来汇总数字.
xxy*_*oel 14
.agg() 函数的变体;提供以下能力:(1) 保留类型 DataFrame,(2) 应用平均值、计数、求和等,以及 (3) 在保持易读性的同时在多列上启用 groupby。
df.groupby(['att1', 'att2']).agg({'att1': "count", 'att3': "sum",'att4': 'mean'})
Run Code Online (Sandbox Code Playgroud)
使用你的价值观...
df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
Run Code Online (Sandbox Code Playgroud)
WeN*_*Ben 11
您可以将groupby
列设置为 index
然后使用sum
withlevel
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
Run Code Online (Sandbox Code Playgroud)
您还可以在 group by 之后的列上使用transform()Number
。此操作将使用函数计算一组中的总数sum
,结果是与原始数据帧具有相同索引的序列。
df['Number'] = df.groupby(['Fruit', 'Name'])['Number'].transform('sum')
df = df.drop_duplicates(subset=['Fruit', 'Name']).drop('Date', 1)
Run Code Online (Sandbox Code Playgroud)
然后,您可以删除列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'))
Run Code Online (Sandbox Code Playgroud)
有一个官方教程Group by:split-apply-combine讲了 group by 之后可以做什么。
归档时间: |
|
查看次数: |
237792 次 |
最近记录: |