如何用Pandas按-1000分组计算有效数据平均值并写入E列?
用Pandas实现传感器数据分组与平均值计算
完全可以用Pandas实现这个需求,以下是具体的实现步骤和代码:
步骤说明
- 标记行类型:先区分待机行(所有列值为-1000)和符合计算条件的有效行(所有列值为正)。
- 生成分组ID:利用待机行的累积计数,将两组待机行之间的有效数据划分为同一组。
- 计算分组平均值:对每个有效组计算平均值,并将结果填充到E列对应行。
代码实现
假设你的传感器数据包含A、B、C、D四列,我们需要生成E列存储分组平均值:
import pandas as pd # 读取数据(替换为你的数据路径或数据源) df = pd.read_csv("sensor_data.csv") # 1. 标记待机行与有效计算行 # 标记所有列均为-1000的待机行 df["is_standby"] = (df[["A", "B", "C", "D"]] == -1000).all(axis=1) # 标记所有列均为正值的有效计算行 df["is_valid"] = (df[["A", "B", "C", "D"]] > 0).all(axis=1) # 2. 生成分组ID:通过待机行的累积和分割有效数据块 # 每次遇到待机行,分组ID递增,有效组内的行共享同一ID df["group_id"] = df["is_standby"].cumsum() # 待机行和不符合计算条件的行不分配分组ID df.loc[~df["is_valid"] | df["is_standby"], "group_id"] = pd.NA # 3. 计算每组平均值并填充到E列 # 对每个有效组计算A-D列的整体平均值 group_avg = df[df["is_valid"]].groupby("group_id")[["A", "B", "C", "D"]].mean().mean(axis=1) # 将分组平均值映射回原数据的E列 df["E"] = df["group_id"].map(group_avg) # 待机行和无效行的E列设为NaN(可根据需求改为其他值,比如-1000) df.loc[~df["is_valid"] | df["is_standby"], "E"] = pd.NA # 可选:删除中间辅助列 df = df.drop(columns=["is_standby", "is_valid", "group_id"])
关键细节解释
- 分组逻辑:
df["is_standby"].cumsum()会给每一行分配一个递增的计数,每次遇到待机行时计数加1,这样两组待机行之间的有效数据会拥有相同的group_id,实现自动分组。 - 平均值计算:先对每组的A-D列分别求均值,再对这四个均值求整体均值(如果需要的是每行的均值再分组平均,逻辑一致,可直接调整为
df[df["is_valid"]].groupby("group_id").mean().mean(axis=1))。 - 结果填充:通过
map将分组平均值对应到组内的每一行,确保有效组内的所有符合条件的行都能看到该组的平均值。
内容的提问来源于stack exchange,提问作者unluckymonster
相关产品推荐
相关产品推荐

