3 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
您可以使用字典以有組織的方式進(jìn)行聚合。
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貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
由于您有多個(gè)變量要聚合,我建議使用以下聚合形式:
df.groupby('id')[<variables-list>].agg([<statistics-list>])
例如:
df_agg = df.groupby('id')[['purchase_amount','price_products','#_products']].agg(["count", "mean", "sum"])
這將創(chuàng)建一個(gè)列式多級(jí)輸出數(shù)據(jù)框,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
然后,您可以使用多索引引用輸出數(shù)據(jù)框中的特定條目,如下所示:
df_agg['purchase_amount']['mean']
id
123 30.0
124 50.0
Name: mean, dtype: float64
或者,如果您想要所有方法,請(qǐng)使用橫截面方法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
注意:據(jù)推測(cè),上面的代碼會(huì)使 Python 計(jì)算比需要更多的統(tǒng)計(jì)信息,就像您的示例中的情況一樣。但這在某些情況下可能不是問題,并且它的優(yōu)點(diǎn)是代碼更短并且可以泛化到要聚合的任何集合和數(shù)量的(數(shù)字和浮點(diǎn)數(shù))變量。

TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
對(duì)所有計(jì)算都這樣做
df.groupby('id')['purchase_amount'].agg({'total_purchase_amount':'sum'})
添加回答
舉報(bào)