我有一個資料集,df如下所示:
| 日期 | 代碼 | 人口 | 數量 |
|---|---|---|---|
| 2021-01-01 | 1000 | 10000 | 5000 |
| 2021-01-02 | 1000 | 10000 | 5013 |
| 2021-01-01 | 2200 | 33000 | 10022 |
| 2021-01-02 | 2200 | 33000 | 10002 |
我想獲取我的資料框的每日加權平均值,其中我的體重是 my Population,并將其存盤在一個新資料集中,df_avg其中僅包含Date和WEIGHTED QTY。我怎樣才能做到這一點?
uj5u.com熱心網友回復:
有兩種方法:1)groupby.apply使用np.average和 2)使用惰性 groupby 手動計算。
路徑 1 更容易編碼,但速度稍慢:
df.groupby('Date')\
.apply(lambda x: np.average(x['QTY'], weights=x['Population']))\
.reset_index(name='avg')
路徑 2 更快,但更冗長:
df['prods'] = df['QTY'] * df['Population']
groups = df.groupby('Date')
groups['prods'].sum().div(groups['Population'].sum()).reset_index(name='avg')
無論哪種方式都可以為您提供輸出:
Date avg
0 2021-01-01 8854.093023
1 2021-01-02 8841.767442
注意,不向資料添加新列的路徑 2 的替代方案涉及兩次 groupby:
df['QTY'].mul(df['Population']).groupby(df['Date']).sum()\
.div(df.groupby('Date')['Population'].sum())\
.reset_index(name='avg')
另一種選擇,涉及管道方法:
(df
.assign(weighted_qty = df.Population * df.QTY)
.groupby('Date')
.pipe(lambda df: df.weighted_qty.sum()/df.Population.sum())
)
Date
2021-01-01 8854.093023
2021-01-02 8841.767442
dtype: float64
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487285.html
上一篇:洗掉串列中所有出現的術語
