通过 Group By Pandas 创建两个聚合列

Posted

技术标签:

【中文标题】通过 Group By Pandas 创建两个聚合列【英文标题】:Create two aggregate columns by Group By Pandas 【发布时间】:2017-01-17 11:07:06 【问题描述】:

我是 DataFrames 的新手,我想对多列进行分组,然后对最后一列求和并保持计数。例如

s = pd.DataFrame(np.matrix([[1, 2,3,4], [3, 4,7,6],[3,4,5,6],[1,2,3,7]]), columns=['a', 'b', 'c', 'd'])

   a  b  c  d
0  1  2  3  4
1  3  4  7  6
2  3  4  5  6
3  1  2  3  7

我想对abc 进行分组,然后对d 求和并计算组中的元素。 我可以数数

s = s.groupby(by=["a", "b", "c"])["d"].count()

    a  b  c
    1  2  3    2
    3  4  5    1
          7    1

我可以总结

s = s.groupby(by=["a", "b", "c"])["d"].sum()

a  b  c
1  2  3    11
3  4  5     6
      7     6

但是我想将它组合起来,使得生成的数据框同时具有 sum 和 count 列。

    a  b  c   sum    count
    1  2  3    11     2
    3  4  5     6     1
          7     6     1

【问题讨论】:

【参考方案1】:

您可以使用aggregate,或更短的版本agg

print (s.groupby(by=["a", "b", "c"])["d"].agg([sum, 'count']))
#print (s.groupby(by=["a", "b", "c"])["d"].aggregate([sum, 'count']))
       sum  count
a b c            
1 2 3   11      2
3 4 5    6      1
    7    6      1

Pandas documentation.

sizecount的区别是:

size 计算 NaN 值,count 不计算。

如果还需要计数NaN 值:

print (s.groupby(by=["a", "b", "c"])["d"].agg([sum, 'size']))
       sum  size
a b c           
1 2 3   11     2
3 4 5    6     1
    7    6     1

【讨论】:

以上是关于通过 Group By Pandas 创建两个聚合列的主要内容,如果未能解决你的问题,请参考以下文章

mysql 可以group by 两个字段吗

group by 后面可以带两个字段吗

pandas group by 在 Datetime 上,格式为 mm.dd.yyyy [重复]

SQL group by分组查询

关于group by 两个或以上条件的分析

关于group by 两个或以上条件的分析