如何对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
相关产品推荐
相关产品推荐

