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

如何高效统计各机器中满足日期环比上升的传感器信息

问题

给定如下结构的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中今日传感器数值大于昨日的传感器名称列表及对应数量,期望输出格式:

MACHINESENSORSN. of SENSORS
MAC1SENS_1,SENS_2,SENS_3,SENS_N4
MAC2SENS_1,SENS_3,SENS_43
MAC3SENS_1,SENS_2,SENS_3,SENS_4,SENS_N5
MAC4SENS_1,SENS_2,SENS_3,SENS_4,SENS_N5
MAC5SENS_1,SENS_2,SENS_3,SENS_N4
MACNSENS_1,SENS_N2

现有逐列判断的实现方式效率极低,无法适配实际场景:近500台机器、150个传感器,且需每2秒执行一次。需要最优实现方案,同时支持NaN数据处理。

最优解决方案

采用Pandas矢量化分组运算替代逐列循环,利用内置的高效聚合逻辑,完全避免Python层面的遍历,大幅提升处理速度。

实现步骤

  1. 分组并计算差值:按MAC分组后,对所有传感器列计算相邻行的差值(今日-昨日),过滤掉每组内的NaN行(仅保留每组第二行的差值结果)。
  2. 筛选符合条件的传感器:判断差值是否大于0,得到布尔矩阵。
  3. 聚合结果:对每个MAC,提取差值大于0的传感器名称并拼接成字符串,同时统计数量。
  4. 处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:24:55