Pandas如何循环匹配A列包含的字符串并更新dept列值
问题原因
你的循环逻辑存在覆盖问题:每次遍历都会重写整个dept列,前一轮匹配到的部门值会被后一轮的"Unknown"默认值覆盖,只有最后一个遍历的部门的匹配结果能保留,因此绝大多数行最终都会变成Unknown。
解决方案
方案1:向量化实现(推荐,性能最优,无需循环)
直接通过正则提取匹配的部门值,即使你有171个部门也能高效运行,不会有性能问题:
import re import pandas as pd depts = ['PHYS', 'PSYCH'] # 拼接正则规则,re.escape可避免部门名包含./*+等正则特殊字符时报错 pattern = '|'.join(re.escape(dept) for dept in depts) # 提取匹配到的第一个部门,未匹配到的填充为Unknown df['dept'] = df['a'].str.extract(f'({pattern})', expand=False).fillna('Unknown')
方案2:循环逻辑修正版
如果需要保留循环写法,只需先初始化默认值,再仅更新匹配到的行即可:
depts = ['PHYS', 'PSYCH'] # 先初始化所有行的dept为默认值 df['dept'] = 'Unknown' for dept in depts: # 仅修改当前未匹配、且符合当前部门规则的行 df.loc[df['a'].str.contains(dept, na=False) & (df['dept'] == 'Unknown'), 'dept'] = dept
na=False参数可以避免a列存在空值时匹配逻辑报错。
逻辑说明
如果某行的a列同时匹配多个部门,两种方案都会优先取部门列表中排在前面的部门值,如果你需要优先取靠后的部门,反转depts列表的遍历顺序即可。
内容的提问来源于stack exchange,提问作者dotslashshawn
相关产品推荐
相关产品推荐

