Pandas中基于分组与权重表计算时间序列分组加权平均的问题
实现Pandas时间序列按分组加权聚合的方法
核心思路
- 先统一处理数据中的空值,将字符串格式的
'nan'转换为Pandas可识别的NaN - 将
df1和weights设置日期列为索引,保证时序对齐 - 计算每个序列对应时间点的加权值:
df1 * weights - 根据
groups的分组映射,将加权后的列名替换为对应分组,按分组列求和即可得到最终结果
完整实现代码
import pandas as pd import numpy as np # 1. 初始化样例数据,替换字符串nan为真实空值,设置日期为索引 df1 = pd.DataFrame({ 'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'], '01K W':[1.2, 2.3, 0.3, 0.5], '02K W':[3.5, 0.1, 'nan', 'nan'], '03K W':[4.2, 5.2, 2.5, 3.0], '04K W':[1.5, 2.6, 8.2, 4.2] }).replace('nan', np.nan).set_index('Date').astype(float) groups = pd.DataFrame({ 'ID':['01K W', '02K W', '03K W', '04K W'], 'Group':['Group1', 'Group1', 'Group2', 'Group1'] }) weights = pd.DataFrame({ 'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'], '01K W':[0.5, 0.5, 0.25, 0.5], '02K W':[0.25, 0.25, 'nan', 'nan'], '03K W':[1, 1, 1, 1], '04K W':[0.25, 0.25, 0.75, 0.5] }).replace('nan', np.nan).set_index('Date').astype(float) # 2. 计算每个序列的加权值 weighted_val = df1 * weights # 3. 构造ID到分组的映射字典 group_map = dict(zip(groups['ID'], groups['Group'])) # 4. 列名替换为分组后按组求和,重置索引得到最终结果 df2 = weighted_val.rename(columns=group_map).sum(axis=1, level=0).reset_index() # 保留两位小数和样例结果对齐 df2 = df2.round(2) print(df2)
输出结果验证
运行代码后得到的df2和预期结果完全一致:
| Date | Group1 | Group2 |
|---|---|---|
| 2021-01-01 | 1.85 | 4.2 |
| 2021-01-02 | 1.82 | 5.2 |
| 2021-01-03 | 6.23 | 2.5 |
| 2021-01-04 | 2.35 | 3.0 |
内容的提问来源于stack exchange,提问作者fjurt
相关产品推荐
相关产品推荐

