如何将groupby值的总和除以另一个值

时间:2018-03-27 13:32:00

标签: python pandas count pandas-groupby

我想通过'标签'和'月'将每个月和每个标签的销售数量相加。

Dataset

我正在努力做到' groupby并申请'实现此目的的方法,但不知道如何计算每个标签的月份。比方说,对于标签值AFFLELOU(DOS),我有7个月的两个值。所以,我应该将销售数量相加并除以2。 在第9个月和第10个月,我只有一个值,所以计数为1,它将除去已售出的数量。

我编写了下面的代码,但它并没有将count作为函数并且返回计数未定义错误。

t1.groupby(['label', 'month']).apply(lambda x: x['Quantity sold'] 
.sum()/count('month'))

有人能告诉我如何获得每个标签的每个月的计数值吗?

先谢谢。

1 个答案:

答案 0 :(得分:5)

您可以使用agg('mean')

,而不是求和,计算和分割
t1.groupby(['label', 'month'])['Quantity sold'].agg('mean') 

或者,如果您确实希望保留金额和计数,请使用:

t1.groupby(['label', 'month'])['Quantity sold'].agg(['sum', 'count', 'mean']) 

例如,

import numpy as np
import pandas as pd

t1 = pd.DataFrame(np.random.randint(4, size=(20,3)), columns=['label', 'Quantity sold', 'month'])
t1.groupby(['label', 'month'])['Quantity sold'].agg(['sum', 'count', 'mean']) 

产生类似

的DataFrame
             sum  count  mean
label month                  
0     1        2      1  2.00
      2        0      1  0.00
      3        2      2  1.00
1     1        1      2  0.50
      2        3      1  3.00
      3        1      1  1.00
2     0        0      1  0.00
      1        0      3  0.00
      3        5      4  1.25
3     0        1      1  1.00
      1        0      1  0.00
      2        0      1  0.00
      3        3      1  3.00

在此处使用groupby/agg及其内置聚合器sumcountmean显然更方便,但如果确实需要使用groupby/apply您可以使用的自定义功能:

t1.groupby(['label', 'month']).apply(lambda x: x['Quantity sold'].sum()/len(x))

请注意,虽然使用groupby/apply调用自定义函数可以提供更大的灵活性,但这是有代价的,因为为每个组调用一次自定义Python函数通常比调用{{1}中可用的内置Cythonized聚合器更慢}。

如果groupby/agg中缺少(NaN)个值,则Quantity sold同时包含group/agg'count'聚合器可能会有所帮助:

  • 'size'返回非'count'
  • 的数量
  • NaN返回组的长度(包括'size'值)

NaN始终小于或等于countsizemean(非sum值)除以NaN。要查看countcount之间的区别,您可以尝试使用以下代码:

size

产生

np.random.seed(2018)
t1 = pd.DataFrame(np.random.randint(4, size=(50,3)), columns=['label', 'Quantity sold', 'month'])
t1.loc[np.random.choice([True, False], len(t1)), 'Quantity sold'] = np.nan
t1.groupby(['label', 'month'])['Quantity sold'].agg(['sum', 'count', 'size', 'mean'])