如何用Python为DataFrame按规则优先级新增分类列
原代码问题说明
原实现存在4处核心错误,导致无法得到预期结果:
- 正则语法错误:
[First]|[Last]属于正则字符集写法,仅会匹配F/i/r/s/t/L/a等单个字符,无法识别完整的[First]/[Last]占位符,方括号作为正则元字符需要转义 - 遍历逻辑错误:
for i in df是遍历DataFrame的列名,并非逐行读取文本内容,直接将整列Series传入re.search会触发类型报错 - 规则覆盖不全:仅写了Save关键词匹配,缺失百分比、现金返还的Offer规则,完全未实现Gratitude、Curiosity、Generic三类判断,且Offer标签错写为Savings
- 列名不匹配:读取文件时定义的列名是
Line/Type,和后续调用的columnA字段不对应
正确实现代码
严格按照规则优先级实现,使用pandas的apply方法逐行匹配,避免手动循环append的低效问题:
import pandas as pd import re # 读取CSV文件,若你的文件无表头可自行调整header/names参数 df = pd.read_csv('2021 Lines Types.csv') def get_category(content): content = str(content) # 最高优先级:匹配个性化占位符 if re.search(r'\[First\]|\[Last\]', content): return "Personalized" # 次优先级:匹配优惠类(Save关键词/百分比折扣/现金返还,忽略大小写) elif re.search(r'save|saves|\d+%|\$\d[,\d]*.*back', content, flags=re.IGNORECASE): return "Offer" # 第三优先级:匹配感谢类内容 elif re.search(r'thank\s*you', content, flags=re.IGNORECASE): return "Gratitude" # 第四优先级:匹配疑问类内容(带问号的问句) elif re.search(r'\?', content): return "Curiosity" # 无匹配规则归为通用类 else: return "Generic" # 生成Column B列 df['Column B'] = df['Column A'].apply(get_category) # 打印验证结果,需要保存文件可取消下一行注释 print(df) # df.to_csv('classified_result.csv', index=False)
运行结果验证
执行代码后输出的分类结果和预期完全一致:
| Column A | Column B |
|---|---|
| Hi [First]! | Personalized |
| Thank You! | Gratitude |
| What Car? | Curiosity |
| Are you [First] [Last]? | Personalized |
| Did you know? | Curiosity |
| Save 25% [First]! | Personalized |
| Get $2,000 Back! | Offer |
| Embrace the road ahead | Generic |
| Everyone saves 30%! | Offer |
内容的提问来源于stack exchange,提问作者AHerdofSeaCows
相关产品推荐
相关产品推荐

