我想通过’label’和’month’分组来计算每个月和每个标签的销售数量.
我正在尝试’groupby和apply’方法来实现这一目标,但不确定如何计算每个标签的月份.比方说,对于标签值AFFLELOU(DOS),我有7个月的两个值.所以,我应该将销售数量相加并除以2.
在第9个月和第10个月,我只有一个值,所以计数为1,它将除去销售数量.
我编写了下面的代码,但它不会将count作为函数并且返回计数未定义错误.
t1.groupby(['label', 'month']).apply(lambda x: x['Quantity sold']
.sum()/count('month'))
有人能告诉我如何获得每个标签每月的计数值吗?
提前致谢.
解决方法:
你可以使用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函数通常比调用groupby / agg中可用的内置Cythonized聚合器要慢.
如果您销售的数量中缺少(NaN)值,则可能有助于知道group / agg同时具有’count’和’size’聚合器:
>’count’返回非NaN值的数量
>’size’返回组的长度(包括NaN值)
计数总是小于或等于大小.平均值是(非NaN值的)之和除以计数.要查看计数和大小之间的差异,您可以尝试使用以下代码:
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'])
产量
sum count size mean
label month
0 1 0.0 0 3 NaN
2 6.0 2 2 3.000000
3 0.0 0 1 NaN
1 0 3.0 2 5 1.500000
1 0.0 0 1 NaN
2 5.0 3 5 1.666667
3 0.0 2 3 0.000000
2 0 7.0 3 5 2.333333
1 4.0 4 8 1.000000
2 5.0 2 3 2.500000
3 5.0 2 3 2.500000
3 0 1.0 2 5 0.500000
1 3.0 1 1 3.000000
2 2.0 1 2 2.000000
3 2.0 1 3 2.000000
标签:python,count,pandas,pandas-groupby