Pandas DataFrame按字典规则生成新列如何优先匹配原有colour列取值
解决方案:基于DataFrame多列规则生成新列并识别无效值
核心修改逻辑
- 规则结构化:将三类犬的颜色规则整合为按
type分类的总字典,减少无效遍历 - 多列联动判断:逐行读取
type、breed、colour三列值作为判断依据,替代原仅靠breed匹配的逻辑 - 颜色优先级调整:先提取当前犬种的所有合法可选颜色,优先返回与原
colour列匹配的值 - 无效值覆盖:识别两种异常场景:① 当前犬种未在规则内收录;② 原
colour列值不在该犬种的合法颜色范围内
完整实现代码
import pandas as pd # 原始DataFrame df = pd.DataFrame({ 'type': ['terrier', 'toy','toy','toy', 'hound' , 'terrier', 'terrier', 'terrier','terrier', 'hound'], 'breed' : ['yorkshire_terrier', 'king_charles_spaniel', 'poodle', 'shih_tzu','greyhound', 'west_highland', 'bull_terrier' , 'fox_terrier', 'west_highland', 'afghan'], 'colour' : ['pink', 'orange','black','purple', 'grey' , 'white', 'black', 'cream','brown', 'brown'] }) # 规则整合总字典 rule_map = { 'toy': {'black' : ['poodle', 'shih_tzu'], 'mixed' : 'king_charles_spaniel','white' : ['poodle', 'shih_tzu']}, 'terrier': {'black_brown' : ['yorkshire_terrier','bull_terrier'],'white' : 'west_highland','white_orange' : 'fox_terrier'}, 'hound': {'brindle' : 'greyhound','brown' : 'afghan'} } def get_new_colour(row): # 获取当前犬类对应的规则 current_rule = rule_map.get(row['type'], {}) allowed_colours = [] # 遍历规则提取当前犬种的所有合法颜色 for colour, breed_range in current_rule.items(): # 统一将单品种字符串转为列表,避免匹配歧义 breed_list = [breed_range] if isinstance(breed_range, str) else breed_range if row['breed'] in breed_list: allowed_colours.append(colour) # 无效场景1:未匹配到该犬种的任何规则 if not allowed_colours: return '无效值:犬种未收录' # 优先匹配原始颜色 if row['colour'] in allowed_colours: return row['colour'] # 无效场景2:原始颜色不在合法范围内,可按需调整返回格式 return f'无效值:颜色不匹配,合法可选值为{allowed_colours}' # 逐行应用函数生成新列 df['new_colour'] = df.apply(get_new_colour, axis=1) print(df)
输出结果验证
type breed colour new_colour 0 terrier yorkshire_terrier pink 无效值:颜色不匹配,合法可选值为['black_brown'] 1 toy king_charles_spaniel orange 无效值:颜色不匹配,合法可选值为['mixed'] 2 toy poodle black black 3 toy shih_tzu purple 无效值:颜色不匹配,合法可选值为['black', 'white'] 4 hound greyhound grey 无效值:颜色不匹配,合法可选值为['brindle'] 5 terrier west_highland white white 6 terrier bull_terrier black black_brown 7 terrier fox_terrier cream 无效值:颜色不匹配,合法可选值为['white_orange'] 8 terrier west_highland brown 无效值:颜色不匹配,合法可选值为['white'] 9 hound afghan brown brown
如果不需要标注可选范围,仅需标记为无效值,可直接修改return值为自定义的无效标识即可。
内容的提问来源于stack exchange,提问作者LeoGER
相关产品推荐
相关产品推荐

