如何向pandas DataFrame新增匹配指定关键词的条件列
原代码的问题
你写的代码有3个明显错误:
- 列名拼写不一致:DataFrame中存储标题的列名是首字母大写的
Title,循环读取时写的是全小写的df["title"],运行时会直接触发KeyError。 - 索引计数器逻辑错误:你把
i=0写在了外层遍历标题的循环内部,每处理一条新标题i都会被重置为0,就算匹配到关键词也只会修改第0行的Tekker值,永远不会更新后续行。 - Pandas链式赋值风险:用
df.Tekker[i] = xxx的方式赋值属于链式索引,Pandas无法保证这个赋值操作会生效,很容易出现SettingWithCopyWarning,实际值写不进DataFrame。
推荐实现方案
优先用Pandas内置的字符串向量化操作,不需要写循环,运行效率高,逻辑也更简洁:
import numpy as np import pandas as pd # 定义待匹配关键词 keyword_list = ["Saham Assurance", "Attijariwafa bank"] # 拼接为正则匹配模式 match_pattern = '|'.join(keyword_list) # 批量提取匹配结果,未命中自动返回NaN df["Tekker"] = df["Title"].str.extract(f'({match_pattern})', expand=False)
如果你更习惯用循环逻辑,可以参考下面的修正版本,避免自己维护索引导致的错误:
df["Tekker"] = np.nan keyword_list = ["Saham Assurance", "Attijariwafa bank"] # 遍历时直接获取行索引和对应标题,不要手动维护计数器 for row_idx, title_text in df["Title"].items(): for kw in keyword_list: if kw in title_text: # 用loc做明确的行列定位赋值,避免链式索引问题 df.loc[row_idx, "Tekker"] = kw # 命中第一个关键词就跳出,避免重复匹配 break
运行以上任意一段代码,都能得到你预期的结果:
| Title | Link | Tekker |
|---|---|---|
| Saham Assurance: Repli de 6% du chiffre d'affaires à fin septembre | link1 | Saham Assurance |
| Société anonyme : Tour de vis dans le contrôle des conventions réglementées | link2 | NaN |
| Attijariwafa bank : Baisse drastique du coût du risque | link3 | Attijariwafa bank |
注意:如果你的关键词里包含正则特殊字符(比如
.、*、?这类),需要先用re.escape()对每个关键词做转义再拼接模式,避免匹配逻辑出错。
内容的提问来源于stack exchange,提问作者Sebastian280797
相关产品推荐
相关产品推荐

