如何高效统计各机器中满足日期环比上升的传感器信息
问题
给定如下结构的Pandas DataFrame(包含NaN场景):
Date MAC SENS_1 SENS_2 SENS_3 SENS_4 SENS_N 0 2023-06-08 MAC1 79.608346 64.2030 66.181849 149.590573 12.135441 1 2023-06-09 MAC1 80.655564 64.6430 67.636943 109.034809 12.278676 2 2023-06-08 MAC2 5.323341 4.7814 57.231430 51.422297 0.494853 3 2023-06-09 MAC2 5.375561 4.7788 63.701169 88.638871 0.471265 4 2023-06-08 MAC3 3.221366 3.0242 61.071023 113.812544 0.251471 5 2023-06-09 MAC3 3.277577 3.0300 67.280632 133.127433 0.274765 6 2023-06-08 MAC4 3.029806 2.6720 63.310941 72.074345 0.393294 7 2023-06-09 MAC4 3.129871 2.6850 72.727142 100.133454 0.408941 8 2023-06-08 MAC5 18.987204 18.1676 57.660920 98.760819 1.219735 9 2023-06-09 MAC5 19.158136 18.1766 61.598102 93.546477 1.270471 10 2023-06-08 MACN 38.190817 35.2416 68.589171 160.597307 2.531353 11 2023-06-09 MACN 38.393878 34.3196 67.710298 139.854140 2.675000
需统计每个MAC中今日传感器数值大于昨日的传感器名称列表及对应数量,期望输出格式:
| MACHINE | SENSORS | N. of SENSORS |
|---|---|---|
| MAC1 | SENS_1,SENS_2,SENS_3,SENS_N | 4 |
| MAC2 | SENS_1,SENS_3,SENS_4 | 3 |
| MAC3 | SENS_1,SENS_2,SENS_3,SENS_4,SENS_N | 5 |
| MAC4 | SENS_1,SENS_2,SENS_3,SENS_4,SENS_N | 5 |
| MAC5 | SENS_1,SENS_2,SENS_3,SENS_N | 4 |
| MACN | SENS_1,SENS_N | 2 |
现有逐列判断的实现方式效率极低,无法适配实际场景:近500台机器、150个传感器,且需每2秒执行一次。需要最优实现方案,同时支持NaN数据处理。
最优解决方案
采用Pandas矢量化分组运算替代逐列循环,利用内置的高效聚合逻辑,完全避免Python层面的遍历,大幅提升处理速度。
实现步骤
- 分组并计算差值:按
MAC分组后,对所有传感器列计算相邻行的差值(今日-昨日),过滤掉每组内的NaN行(仅保留每组第二行的差值结果)。 - 筛选符合条件的传感器:判断差值是否大于0,得到布尔矩阵。
- 聚合结果:对每个MAC,提取差值大于0的传感器名称并拼接成字符串,同时统计数量。
- 处理NaN:由于NaN与任何数值比较结果均为False,含NaN的传感器会自动被排除;若需自定义NaN逻辑,可在差值计算前用
fillna()填充。
完整代码
import pandas as pd # 确保Date列为日期类型 df['Date'] = pd.to_datetime(df['Date']) # 提取所有传感器列 sensor_cols = [col for col in df.columns if col.startswith('SENS_')] # 按MAC分组计算传感器差值(今日-昨日),保留每组有效差值行 diff_df = df.groupby('MAC')[sensor_cols].diff().dropna() # 生成差值大于0的布尔掩码 mask = diff_df > 0 # 聚合得到目标结果 result = mask.apply( lambda x: pd.Series({ 'SENSORS': ','.join(x.index[x]), 'N. of SENSORS': x.sum() }), axis=1 ).reset_index().rename(columns={'MAC': 'MACHINE'}) # 输出格式化表格 print(result.to_markdown(index=False, colalign=['left', 'center', 'right']))
关键优化点
- 矢量化运算:所有比较、聚合操作均在Pandas底层C语言实现,避免Python循环的性能损耗。
- 分组差值计算:
groupby().diff()直接生成每组的今日-昨日差值,无需手动匹配MAC和shift行。 - 自动NaN处理:含NaN的传感器在差值计算后仍为NaN,
diff_df>0会返回False,不会被计入统计结果。
内容的提问来源于stack exchange,提问作者drnsrc
相关产品推荐
相关产品推荐

