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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:33:19