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

如何对DataFrame按时间分组计算加权平均值?

如何用Pandas实现按时间分组的加权平均计算?

首先我们先还原你的示例数据:

import pandas as pd

# 构建示例DataFrame
data = {
    'Time': ['2020-10-30 18:00:00', '2020-10-30 18:00:00',
             '2020-10-30 18:12:00', '2020-10-30 18:12:00', '2020-10-30 18:12:00'],
    'x': [1, 2, 5, 4, 3],
    'y': [265.0, 265.0, 263.5, 412.0, 412.0]
}
df = pd.DataFrame(data)

根据你的需求,我们需要按Time分组,计算每组的x总和以及y的加权平均值(权重为x),这里提供两种简洁的实现方式:

方法一:先计算中间列再聚合(直观易读)

这种方式先创建一个存储x*y乘积的中间列,再分组聚合计算所需指标:

# 1. 计算每行x和y的乘积
df['x_y_product'] = df['x'] * df['y']

# 2. 按Time分组,聚合计算x的总和、x*y的总和
grouped_stats = df.groupby('Time').agg(
    sum=('x', 'sum'),          # 每组x的总和
    total_x_y=('x_y_product', 'sum')  # 每组x*y的总和
).reset_index()

# 3. 计算加权平均值
grouped_stats['weighted_avg_y'] = grouped_stats['total_x_y'] / grouped_stats['sum']

# 4. 保留需要的列,得到最终结果
final_result = grouped_stats[['Time', 'sum', 'weighted_avg_y']]

方法二:直接用apply分组计算(无需中间列)

如果你不想创建中间列,可以用groupby.apply直接对每个分组进行计算:

final_result = df.groupby('Time').apply(
    lambda group: pd.Series({
        'sum': group['x'].sum(),
        'weighted_avg_y': (group['x'] * group['y']).sum() / group['x'].sum()
    })
).reset_index()

验证结果

运行上述代码后,打印final_result会得到你预期的输出:

Time  sum  weighted_avg_y
0 2020-10-30 18:00:00    3           265.0
1 2020-10-30 18:12:00   12           350.0

补充说明

  • 两种方法本质逻辑一致,第一种更适合新手理解,第二种更简洁;
  • 如果你的Time列是字符串类型,建议先转换为datetime类型(df['Time'] = pd.to_datetime(df['Time'])),方便后续可能的时间序列操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:17:29