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

如何计算DataFrame每日Pos1/3/5/7列Numb均值并减对应ctrl值

实现方案

你提到的拆分DataFrame再拼接的思路可以实现需求,但完全没必要,用pandas分组聚合一步就能完成计算,代码更简洁、性能也更好。

前提假设

默认你的原始DataFrame包含三列:

  • date:存储日期值
  • pos:存储位置标识,取值为Pos1/Pos2/.../Pos7/ctrl
  • numb:存储对应的数值

核心实现代码

import pandas as pd

# 定义需要参与均值计算的位置列表
target_pos_list = ["Pos1", "Pos3", "Pos5", "Pos7"]

# 按日期分组直接计算最终结果
calc_result = df.groupby(by="date", as_index=False).apply(
    lambda day_data: pd.Series({
        "pos_avg": day_data.loc[day_data["pos"].isin(target_pos_list), "numb"].mean(),
        "ctrl_value": day_data.loc[day_data["pos"] == "ctrl", "numb"].iloc[0],
        "final_result": day_data.loc[day_data["pos"].isin(target_pos_list), "numb"].mean() - day_data.loc[day_data["pos"] == "ctrl", "numb"].iloc[0]
    })
).reset_index(drop=True)

逻辑说明

  • 代码会自动按日期拆分每日数据,不需要手动拆分两个独立DataFrame
  • 针对单日数据,先筛选出Pos1、Pos3、Pos5、Pos7对应的numb值计算均值,再提取当日ctrl对应的数值,直接做减法得到结果
  • 以你举的2022/03/03数据为例,计算过程为(92+17+51+79)/4 - 38 = 21.75,和你预期的计算规则完全一致

补充说明

如果你的数据集存在某天缺失指定Pos数据、或者缺失ctrl行的情况,可以在计算时加异常判断:

  • 计算均值时默认会自动跳过空值,也可以手动加dropna=True参数明确规则
  • 取ctrl值时可以先判断当日是否存在ctrl行,避免索引报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:31:14