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'})
添加回答
舉報