You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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和预期结果完全一致:

DateGroup1Group2
2021-01-011.854.2
2021-01-021.825.2
2021-01-036.232.5
2021-01-042.353.0

内容的提问来源于stack exchange,提问作者fjurt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:24:04