合并不同列名的时序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
相关产品推荐
相关产品推荐

