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

Pandas分类列编码:按RAL/NCS类型及NCS明暗度映射为4类

解决方案:DataFrame颜色列分类编码

核心思路

先清洗字符串(去除首尾空格)、处理NaN值,再按RAL→NCS深浅→其他的优先级分层判断,避免条件冲突和NA导致的报错。

完整代码

import pandas as pd

# 1. 清洗颜色列:去除首尾空格,填充NaN为空字符串
df_test['maling_utv_clean'] = df_test['maling_utv'].str.strip().fillna('')

# 2. 初始化编码列为3(其他类)
df_test['color_code'] = 3

# 3. 标记RAL类(编码2)
ral_mask = df_test['maling_utv_clean'].str.startswith('RAL')
df_test.loc[ral_mask, 'color_code'] = 2

# 4. 处理NCS类,分浅色(0)和深色(1)
ncs_mask = df_test['maling_utv_clean'].str.startswith('NCS')
if not df_test[ncs_mask].empty:
    # 提取NCS亮度值(S后四位数字的前两位,转为整数)
    ncs_brightness = df_test.loc[ncs_mask, 'maling_utv_clean'].str.extract(r'NCS S (\d{2})\d{2}')[0].astype(int)
    # 浅色NCS:亮度>=70;深色NCS:亮度<70
    df_test.loc[ncs_mask & (ncs_brightness >= 70), 'color_code'] = 0
    df_test.loc[ncs_mask & (ncs_brightness < 70), 'color_code'] = 1

之前报错的原因分析

  1. loc()报错:
    未处理NaN值,str.startswith遇到NaN会返回非布尔值,导致mask数组包含NA。通过fillna('')或在str.startswith中添加na=False(将NaN转为False)即可解决。

  2. np.where()报错:
    np.where要求必须同时传入condition、x、y三个参数,或仅传condition返回索引。你大概率只传入了两个参数,导致参数不匹配。

  3. mask()报错:
    mask方法要求传入纯布尔数组,但你的mask因NaN存在转为了float类型(NaN属于float),用~取反时类型不兼容。先将NaN转为布尔值即可避免。

示例验证

用你给出的测试数据运行后,color_code结果如下:

maling_utvcolor_code
NCS S 8500 N0
NCS S 9000 N0
NCS S 0502 Y1
RAL 90042
NCS S 7500 N0
NCS S 8000 N0
NCS S 0500 N1
RAL 90052
RAL 90112
NCS S 5502 Y1
RAL 80222
RAL 70162
NCS S 6502 G1
Klar lakk3

内容的提问来源于stack exchange,提问作者Anne Høgdahl Skjærseth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:53:32