您可以使用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 聚合器要慢。
如果您在 Quantity sold 中缺少 (NaN) 值,了解 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'])
产生
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