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

合并不同列名的时序DataFrame并筛选符合阈值的传感器

需求说明

我有两个DataFrame:

  • sensor:时序数据,以sensor_ts列为索引,其余列是传感器名称,单元格存储对应时刻的传感器数值。
  • train:包含id_sensor列(与sensor的列名一一对应)和boot_threshold列(存储各传感器的阈值)。

需要生成一个新DataFrame,保留时序顺序,仅包含每个时刻数值高于对应boot_threshold的传感器数据。


数据概览

train 数据集信息

train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 264 entries, 0 to 263
Data columns (total 17 columns):
 #   Column               Non-Null Count  Dtype  
---  ------               --------------  -----  
 0   id_train             264 non-null    object 
 1   asset_id             264 non-null    object 
 2   train_type           264 non-null    object 
 3   equipment_type       264 non-null    object 
 4   id_sensor            264 non-null    object 
 5   unit                 262 non-null    object 
 6   is_operating         262 non-null    float64
 7   will_be_available    262 non-null    float64
 8   pi_acquisition_date  0 non-null      float64
 9   pi_description       264 non-null    object 
 10  sensor_description   264 non-null    object 
 11  tag_id               262 non-null    float64
 12  priority             262 non-null    float64
 13  for_ml               264 non-null    int64  
 14  onoff_parameter      264 non-null    int64  
 15  boot_threshold       264 non-null    int64  
 16  efficiency_index     264 non-null    int64  
dtypes: float64(5), int64(4), object(8)
memory usage: 35.2+ KB

sensor 数据集信息

sensor.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1729930 entries, 0 to 1729929
Columns: 135 entries, level_0 to Australia.Blacktip.ICSS.KPI.EE.GasTurbineEfficiency_A
dtypes: float64(132), int64(2), object(1)
memory usage: 1.7+ GB

sensor 列名示例

sensor.columns
Index(['level_0', 'index', 'sensor_ts',
       'Australia.Blacktip.ICSS.360140413-100.PV',
       'Australia.Blacktip.ICSS.360140415-100.PV',
       'Australia.Blacktip.ICSS.360140417-100.PV',
       'Australia.Blacktip.ICSS.360140421-100.PV',
       'Australia.Blacktip.ICSS.360140423-100.PV',
       'Australia.Blacktip.ICSS.360140425-100.PV',
       'Australia.Blacktip.ICSS.360140433-100.PV',
       ...
       'Australia.Blacktip.ICSS.3601PDI144.DACA.PV',
       'Australia.Blacktip.ICSS.3601PIT111.PV',
       'Australia.Blacktip.ICSS.3601PIT141.PV',
       'Australia.Blacktip.ICSS.3601TIT042.PV',
       'Australia.Blacktip.ICSS.3601TIT052.PV',
       'Australia.Blacktip.ICSS.3601TIT111.PV',
       'Australia.Blacktip.ICSS.3601TIT122.PV',
       'Australia.Blacktip.ICSS.3601TIT141.PV',
       'Australia.Blacktip.ICSS.3601TIT152.PV',
       'Australia.Blacktip.ICSS.KPI.EE.GasTurbineEfficiency_A'],
      dtype='object', length=135)

解决方案

步骤1:构建传感器-阈值映射表

从train中提取sensor存在的传感器对应的阈值,避免无效匹配:

# 筛选出sensor中存在的传感器,构建id_sensor到boot_threshold的映射
threshold_map = train[train['id_sensor'].isin(sensor.columns)].set_index('id_sensor')['boot_threshold']

步骤2:清洗sensor时序数据

设置sensor_ts为索引,移除无关的辅助列(level_0、index):

# 设置时序索引,清理无关列
sensor_clean = sensor.set_index('sensor_ts').drop(['level_0', 'index'], axis=1)

步骤3:筛选符合阈值条件的数据

利用pandas的广播特性高效比较每个传感器的数值与对应阈值,保留符合条件的数据:

# 生成布尔掩码:每个单元格值是否大于对应传感器的阈值
mask = sensor_clean > threshold_map

# 保留超过阈值的数值,未达阈值的位置设为NaN
filtered_sensor = sensor_clean.where(mask)

# 可选:删除完全没有有效数据的时序行(根据需求选择)
filtered_sensor = filtered_sensor.dropna(axis=0, how='all')

最终结果

filtered_sensor即为目标DataFrame:

  • 索引保持sensor_ts,时序顺序不变
  • 仅保留每个时刻数值超过对应阈值的传感器数据,未达阈值的位置显示为NaN(可根据后续需求进一步处理,比如删除NaN列等)

内容的提问来源于stack exchange,提问作者Emilio Mastriani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:48:13