Python pandas实现CGM非空行动态窗口均值与求和统计
Pandas 生物识别数据按CGM有效值聚合精简方案
核心实现思路
不用逐行写if判断循环,利用pandas内置的分组聚合能力就能实现需求,逻辑完全匹配规则:
- 先给所有数据打分组标签:每遇到一个CGM列非NaN的行,分组编号加1,两个相邻CGM有效值之间的所有空值行,和后面的CGM有效值行归为同一组,天然对应需要计算的n行区间
- 直接按分组做聚合计算,聚合完成的结果就是仅保留CGM有效值行的精简表,不需要额外做删空值操作
可直接运行代码
import pandas as pd import numpy as np # -------------------------- # 把下面的测试样例替换成你自己的DataFrame变量即可 # -------------------------- df = pd.DataFrame({ 'Time': pd.date_range(start='2024-01-01 08:00:00', periods=7, freq='1min'), 'CGM': [np.nan, 5.6, np.nan, np.nan, 6.2, np.nan, 7.1], 'HR': [72, 75, 76, 74, 78, 80, 77], 'steps': [0, 12, 35, 22, 48, 10, 5], 'distance': [0, 8.2, 23.1, 14.5, 32.7, 6.8, 3.3], 'calories': [0, 1.1, 2.3, 1.5, 3.2, 0.7, 0.4] }) # 生成分组辅助列 df['group_tag'] = df['CGM'].notna().cumsum() # 按分组执行聚合 result = df.groupby('group_tag', as_index=False).agg( Time=('Time', 'last'), CGM=('CGM', 'last'), HR=('HR', 'mean'), steps=('steps', 'sum'), distance=('distance', 'sum'), calories=('calories', 'sum') ).drop(columns='group_tag') # 打印结果验证 print(result)
逻辑匹配说明
- 首个CGM有效值所在分组会包含从数据第一行到当前CGM行的所有数据,HR算平均值、其余三列算累加和,完全符合首个区间n的计算规则
- 后续每个CGM有效值所在分组,刚好包含上一个CGM行的下一行到当前CGM行的所有数据,n值会随两个CGM值之间的空行数量自动适配,不需要手动计算间隔
- 聚合后输出的结果表字段顺序和要求一致:Time、CGM、HR、steps、distance、calories,没有多余字段
适配调整提示
- 如果HR列存在空值,默认
mean()计算会自动跳过空值,符合常规数据处理场景;如果需要空值时整组HR返回NaN,把HR的聚合规则替换为HR=('HR', lambda x: x.mean(skipna=False))即可 - 确保steps、distance、calories三列是数值类型,否则累加计算会报错,非数值类型可以提前用
pd.to_numeric()做转换
内容的提问来源于stack exchange,提问作者TomPythonHelp
相关产品推荐
相关产品推荐

