如何计算DataFrame每日Pos1/3/5/7列Numb均值并减对应ctrl值
实现方案
你提到的拆分DataFrame再拼接的思路可以实现需求,但完全没必要,用pandas分组聚合一步就能完成计算,代码更简洁、性能也更好。
前提假设
默认你的原始DataFrame包含三列:
date:存储日期值pos:存储位置标识,取值为Pos1/Pos2/.../Pos7/ctrlnumb:存储对应的数值
核心实现代码
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
相关产品推荐
相关产品推荐

