如何基于Pandas DataFrame两列(传感器号+斜率)映射生成新列
嘿,你这个需求很典型——要同时结合Sensor_Num和slope两个字段来映射组件,而不是单一依赖传感器编号对吧?我给你分享几个实用的实现方法,你可以根据自己的场景来选:
方法1:用元组作为字典的键(适合精确匹配场景)
如果你的映射规则是Sensor_Num和slope的精确值组合,可以直接把这两个值拼成元组作为字典的键,这样就能实现双条件映射:
# 定义双条件映射字典,键是(Sensor_Num, slope)的元组 component_map = { (1015, 0.5): 'Blade_Fatigue_TypeA', (1015, 1.2): 'Blade_Fatigue_TypeB', (215, 0.3): 'Hub_pitch_Bolts_Loose', (215, 0.8): 'Hub_pitch_Bolts_Tight' } # 逐行组合两个字段的值,用get方法避免匹配失败报错,还能设置默认值 df_fatigue_filtered['Component_List'] = df_fatigue_filtered.apply( lambda row: component_map.get((row['Sensor_Num'], row['slope']), 'Unknown_Component'), axis=1 )
这里用dict.get()的好处是,当找不到对应的(Sensor_Num, slope)组合时,会返回你指定的默认值(比如Unknown_Component),不会直接抛出KeyError。
方法2:自定义函数+apply(适合复杂逻辑/区间判断)
如果你的映射不是精确匹配,而是需要根据slope的区间范围来判断(比如斜率小于1.0是一种组件,大于等于1.0是另一种),那写个自定义函数会更灵活:
def get_matching_component(sensor_num, slope): # 针对不同传感器编号设置不同的斜率判断逻辑 if sensor_num == 1015: if slope < 1.0: return 'Blade_Fatigue_Low_Risk' else: return 'Blade_Fatigue_High_Risk' elif sensor_num == 215: if slope < 0.5: return 'Hub_pitch_Bolts_Warning' else: return 'Hub_pitch_Bolts_Critical' # 处理未定义的传感器编号 else: return 'Unknown_Component' # 把函数应用到DataFrame的每一行 df_fatigue_filtered['Component_List'] = df_fatigue_filtered.apply( lambda row: get_matching_component(row['Sensor_Num'], row['slope']), axis=1 )
这种方法的优势是逻辑清晰,你可以轻松扩展更多传感器的判断规则,甚至加入其他字段的条件。
方法3:用辅助DataFrame做merge(适合大量映射规则)
如果你的映射规则特别多(比如上百种Sensor_Num+slope的组合),用字典或者函数会显得杂乱,这时候可以把映射规则做成一个单独的DataFrame,然后用merge来匹配:
import pandas as pd # 创建包含所有映射规则的辅助DataFrame mapping_rules = pd.DataFrame({ 'Sensor_Num': [1015, 1015, 215, 215, 3001], 'slope': [0.5, 1.2, 0.3, 0.8, 0.6], 'Component_List': [ 'Blade_Fatigue_TypeA', 'Blade_Fatigue_TypeB', 'Hub_pitch_Bolts_Loose', 'Hub_pitch_Bolts_Tight', 'Gearbox_Wear' ] }) # 用merge进行双字段匹配,how='left'保留原DataFrame的所有行 df_fatigue_filtered = df_fatigue_filtered.merge( mapping_rules, on=['Sensor_Num', 'slope'], how='left' ) # 把匹配不到的空值替换成默认组件 df_fatigue_filtered['Component_List'] = df_fatigue_filtered['Component_List'].fillna('Unknown_Component')
这种方法的好处是映射规则可以单独维护(比如从Excel文件导入),后期修改或者新增规则都很方便。
小提醒
- 注意
Sensor_Num的数据类型要和映射规则里的一致:如果原DataFrame里是字符串类型(比如'1015'),那字典或辅助DataFrame里的键也要是字符串,不然会匹配失败。 - 如果
slope是浮点型,要注意精度问题:比如实际数据里的slope是0.5000001,但你映射规则里写的是0.5,就会匹配不到。这种情况可以先把slope四舍五入到指定小数位(比如round(row['slope'], 1))再进行匹配。
内容的提问来源于stack exchange,提问作者Purushotham Sharma
相关产品推荐
相关产品推荐

