3 回答
TA贡献1827条经验 获得超9个赞
您可以使用字典以有组织的方式进行聚合。
df = pd.DataFrame([[123, 30, 20, 2],
[123, np.nan, 10, np.nan],
[124, 50, 25, 3],
[124, np.nan, 15, np.nan],
[124, np.nan, 10, np.nan]],
columns=['id', 'purchase_amount', 'price_products', 'num_products']
)
agg_dict = {
'purchase_amount': [np.sum, np.mean],
'num_products': [np.count_nonzero],
'price_products': [np.count_nonzero, np.mean],
}
print(df.groupby('id').agg(agg_dict))
输出:
purchase_amount num_products price_products
sum mean count_nonzero count_nonzero mean
id
123 30.0 30.0 2.0 2 15.000000
124 50.0 50.0 3.0 3 16.666667
TA贡献1817条经验 获得超6个赞
由于您有多个变量要聚合,我建议使用以下聚合形式:
df.groupby('id')[<variables-list>].agg([<statistics-list>])
例如:
df_agg = df.groupby('id')[['purchase_amount','price_products','#_products']].agg(["count", "mean", "sum"])
这将创建一个列式多级输出数据框,df_agg如下所示:
purchase_amount price_products #_products
count mean sum count mean sum count mean sum
id
123 1 30.0 30.0 2 15 30 1 2.0 2.0
124 1 50.0 50.0 3 17 51 1 3.0 3.0
然后,您可以使用多索引引用输出数据框中的特定条目,如下所示:
df_agg['purchase_amount']['mean']
id
123 30.0
124 50.0
Name: mean, dtype: float64
或者,如果您想要所有方法,请使用横截面方法xs():
df_agg.xs('mean', axis=1, level=1)
purchase_amount price_products #_products
id
123 30.0 15 2.0
124 50.0 17 3.0
注意:据推测,上面的代码会使 Python 计算比需要更多的统计信息,就像您的示例中的情况一样。但这在某些情况下可能不是问题,并且它的优点是代码更短并且可以泛化到要聚合的任何集合和数量的(数字和浮点数)变量。
TA贡献1998条经验 获得超6个赞
对所有计算都这样做
df.groupby('id')['purchase_amount'].agg({'total_purchase_amount':'sum'})
添加回答
举报