如何根据多个外部列表向Pandas DataFrame有条件插入标签列值
问题原因
- 大小写不匹配:你定义的关键词多为小写,但
PARTICULARS列内容为大写,直接匹配必然失败 - 函数逻辑错误:
apply是逐行处理,但你的add_label没有获取当前行的PARTICULARS内容,反而判断关键词是否存在于整个列的拆分结果中,完全偏离需求 - 语法错误:你用了比较运算符
==做赋值操作,同时普通列表没有__name__属性,无法直接获取列表名 - 逻辑遗漏:只传入了fuel相关列表,cc、ref两个规则完全没有用到
正确实现
首先构造标签和关键词的映射字典,统一转小写做模糊匹配,避免大小写问题,实现代码如下:
import pandas as pd import numpy as np # 构造标签-关键词映射字典,统一管理匹配规则 label_map = { 'fuel': ['hpcl', 'bpcl'], 'cc': ['brn', 'del', 'rq'], 'ref': ['transfer', 'tx'] } # 定义逐行匹配函数 def get_label(particulars): # 统一转小写,避免大小写适配问题 p_lower = particulars.lower() for label, keywords in label_map.items(): for kw in keywords: if kw in p_lower: return label # 无匹配返回NaN return np.nan # 应用函数生成Label列 df['Label'] = df['PARTICULARS'].apply(get_label)
运行结果验证
执行后输出和你预期完全一致:
| DATE | PARTICULARS | DR | CR | Label | |
|---|---|---|---|---|---|
| 0 | 04-03-2017 | UPI PA | 10000 | 0.0 | NaN |
| 1 | 04-03-2017 | UPI PA | 10000 | 0.0 | NaN |
| 2 | 04-03-2017 | POS BPCL COCO PU | 1000 | 0.0 | fuel |
| 3 | 04-03-2017 | BRN PYMT CARD | 2536 | 0.0 | cc |
| 4 | 04-03-2017 | UPI PA | 10050 | 0.0 | NaN |
| 5 | 04-03-2017 | POS BPCL COCO PU | 1000 | 0.0 | fuel |
| 6 | 04-04-2017 | INB IFT PARTY TRANSFER | 60000 | 0.0 | ref |
优化方案(大数据量推荐)
如果数据量超过10万行,用向量化的str.contains代替apply性能更高:
df['Label'] = np.nan for label, keywords in label_map.items(): pattern = '|'.join(keywords) mask = df['PARTICULARS'].str.contains(pattern, case=False, na=False) df.loc[mask, 'Label'] = label
内容的提问来源于stack exchange,提问作者therion
相关产品推荐
相关产品推荐

