同一groupby中一列的计数和另一列的总和?

2024-06-11 21:42:35 发布

您现在位置:Python中文网/ 问答频道 /正文

此数据帧:

df = pd.DataFrame({'delivery_date' : ['2018-09-07' ,'2018-09-07','2018-09-08','2018-09-09','2018-09-10'],
              'user' : ['user1','user1','user2','user3','user3'],
             'number_of_papers' : [3,4,3,2,4]}) 

我想按delivery_dateuser分组。其中:

  • 找到count次一个user已经在一天内交付了一些东西
  • 查找number_of_paperssum

我使用了.agg,但我认为它不适用于这里,因为countsum是关于不同的列的

df.groupby(['delivery_date','user'])['delivery_date'].agg(['count','sum']).sort_index(level=[0,1], ascending=[False,True]).reset_index(name ='Counts')

Error TypeError: reduction operation 'sum' not allowed for this dtype

总和应该是number_of_papers。我不知道在groupby的什么地方写这个

示例: 除sum部分外,这将执行所有操作:

a.groupby(['delivery_date','user'])['delivery_date'].count().sort_index(level=[0,1], ascending=[False,True]).reset_index(name ='counts')

提供:

delivery_date   user    counts
0   2018-09-10  user3   1
1   2018-09-09  user3   1
2   2018-09-08  user2   1
3   2018-09-07  user1   2

我只想在这个表中做sumnumber_of_papers,作为一个名为sum的新列


Tags: ofnumberdfdateindexcountaggsum
2条回答

使用^{}函数中的字典进行与列相关的特定计算,然后rename列和reset_index

df.groupby(['delivery_date','user']).agg({'delivery_date':'count','number_of_papers':'sum'}).\
                                     sort_index(level=[0,1], ascending=[False,True]).\
                                     rename(columns={'delivery_date':'count','number_of_papers':'sum'}).\
                                     reset_index()

    delivery_date   user    count   sum
0   2018-09-10      user3   1       4
1   2018-09-09      user3   1       2
2   2018-09-08      user2   1       3
3   2018-09-07      user1   2       7

你可以这样使用agg

enter image description here

    df.groupby(['delivery_date', 'user'])['number_of_papers'].agg('sum')

相关问题 更多 >