如何在Pandas或NumPy中简便实现累积加权平均计算?
加权累积平均值的Pandas/NumPy实现方案
当然可以啦!用Pandas或者NumPy都能轻松实现你想要的加权累积平均值计算,虽然Pandas没有直接提供pd.cum_mean(value=df.val, weight=df.wt)这种现成函数,但通过简单的组合操作就能达到目的,逻辑完全贴合你的计算规则。
先明确下需求:
原始DataFrame
| val | wt |
|---|---|
| 1 | 100 |
| 2 | 300 |
| 3 | 200 |
目标DataFrame
| val | wt | cum_wt_avg |
|---|---|---|
| 1 | 100 | 100 |
| 2 | 300 | 220 |
| 3 | 200 | 210 |
计算规则:cum_wt_avg[i] = cum_sum(val*wt)[i] / cum_sum(wt)[i]
用Pandas实现(推荐)
直接利用Pandas的cumsum()方法,一步就能算出结果,代码简洁又直观:
import pandas as pd # 构造原始数据 df = pd.DataFrame({'val': [1, 2, 3], 'wt': [100, 300, 200]}) # 计算加权累积和与权重累积和,相除得到目标列 df['cum_wt_avg'] = (df['val'] * df['wt']).cumsum() / df['wt'].cumsum() print(df)
运行这段代码后,输出结果和你想要的目标DataFrame完全一致,而且计算效率很高,适合处理大规模数据。
用NumPy实现
如果习惯用NumPy的话,原理也是一样的,先计算两个数组的累积和再相除:
import numpy as np import pandas as pd # 定义原始数组 val_arr = np.array([1, 2, 3]) wt_arr = np.array([100, 300, 200]) # 计算累积和与最终结果 cum_val_wt = np.cumsum(val_arr * wt_arr) cum_wt = np.cumsum(wt_arr) cum_wt_avg_arr = cum_val_wt / cum_wt # 转成DataFrame格式 df = pd.DataFrame({'val': val_arr, 'wt': wt_arr, 'cum_wt_avg': cum_wt_avg_arr})
内容的提问来源于stack exchange,提问作者Mani Bharathy
相关产品推荐
相关产品推荐

