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
之前报错的原因分析
loc()报错:
未处理NaN值,str.startswith遇到NaN会返回非布尔值,导致mask数组包含NA。通过fillna('')或在str.startswith中添加na=False(将NaN转为False)即可解决。np.where()报错:
np.where要求必须同时传入condition、x、y三个参数,或仅传condition返回索引。你大概率只传入了两个参数,导致参数不匹配。mask()报错:
mask方法要求传入纯布尔数组,但你的mask因NaN存在转为了float类型(NaN属于float),用~取反时类型不兼容。先将NaN转为布尔值即可避免。
示例验证
用你给出的测试数据运行后,color_code结果如下:
| maling_utv | color_code |
|---|---|
| NCS S 8500 N | 0 |
| NCS S 9000 N | 0 |
| NCS S 0502 Y | 1 |
| RAL 9004 | 2 |
| NCS S 7500 N | 0 |
| NCS S 8000 N | 0 |
| NCS S 0500 N | 1 |
| RAL 9005 | 2 |
| RAL 9011 | 2 |
| NCS S 5502 Y | 1 |
| RAL 8022 | 2 |
| RAL 7016 | 2 |
| NCS S 6502 G | 1 |
| Klar lakk | 3 |
内容的提问来源于stack exchange,提问作者Anne Høgdahl Skjærseth
相关产品推荐
相关产品推荐

