熊猫分组和总和

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)

  • 大熊猫怎么知道我想把名为`Number`的col加起来? (60认同)
  • @Kingname如果你拿出NAME和FRUIT,它就是最后一栏.如果你添加2列,它将两列相加 (8认同)
  • @StevenG 对于为总结特定列而提供的答案,输出以 Pandas 系列而不是 Dataframe 的形式出现。根据 Jakub Kukul 的评论(在下面的答案中),我们可以在“Number”周围使用双方括号来获取数据框。 (5认同)
  • @tgdn df.groupby(['Name','Fruit'])['Number']。sum() (4认同)
  • 如何指定要累加的列? (2认同)

Sau*_*abh 137

你也可以使用agg功能,

df.groupby(['Name', 'Fruit'])['Number'].agg('sum')
Run Code Online (Sandbox Code Playgroud)

  • 这与接受的答案不同,它返回一个“Series”,而另一个返回“GroupBy”对象。 (3认同)
  • @GaurangTandon改为获取“ DataFrame”对象(如在接受的答案中一样),在“'Number'`周围使用双方括号,即:'df.groupby(['Name','Fruit'])[[''Number' ]]。agg('sum')` (3认同)

小智 59

如果您想保留原始列FruitName使用reset_index().否则,FruitName将成为指数的一部分.

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 然后使用sumwithlevel

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)


Ynj*_*jmh 6

您还可以在 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通过指定轴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'))
Run Code Online (Sandbox Code Playgroud)

有一个官方教程Group by:split-apply-combine讲了 group by 之后可以做什么。