我想通过'标签'和'月'将每个月和每个标签的销售数量相加。
我正在努力做到' groupby并申请'实现此目的的方法,但不知道如何计算每个标签的月份。比方说,对于标签值AFFLELOU(DOS),我有7个月的两个值。所以,我应该将销售数量相加并除以2。 在第9个月和第10个月,我只有一个值,所以计数为1,它将除去已售出的数量。
我编写了下面的代码,但它并没有将count作为函数并且返回计数未定义错误。
t1.groupby(['label', 'month']).apply(lambda x: x['Quantity sold']
.sum()/count('month'))
有人能告诉我如何获得每个标签的每个月的计数值吗?
先谢谢。
答案 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
及其内置聚合器sum
,count
和mean
显然更方便,但如果确实需要使用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
始终小于或等于count
。 size
是mean
(非sum
值)除以NaN
。要查看count
和count
之间的区别,您可以尝试使用以下代码:
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'])