DataFrame清洗需求:筛选name列含对应company值的行
DataFrame数据清洗:筛选company值包含在name列的行
我正在做DataFrame数据清洗的收尾工作,处理name列时遇到了问题:需要逐行校验,判断company列的内容是否包含在对应行的name文本中——包含则保留该行,不包含就删除。目前示例里company的值都在name开头,但得兼容它出现在name任意位置的情况。
我试了下面这段代码,但无法正常运行:
for x in file["company"]:#Loop company for i in file["name"]:#Loop name i = i.title().split(" ")#Capitalize each word and split name for j in i: if j == x:#if the "company name" is equal to "company values" pass #ignore else: file.drop("""THAT ROW""") #remove that row
问题分析
你写的代码存在几个核心问题:
- 嵌套循环遍历
company和name列的所有元素,没有关联到同一行的两个值,逻辑完全错位 drop方法没有指定合法的行索引,直接写"THAT ROW"是无效语法- 把name拆成单个单词再匹配,无法处理多词的company名称(比如"ABC Group"),也不符合"任意位置包含"的需求
正确解决方法
用pandas的矢量化操作来实现,效率更高且逻辑清晰,同时处理大小写问题避免匹配误差:
方法1:基础文本包含判断
统一转成小写后,逐行检查company是否在name中:
# 生成布尔掩码:每行company小写后是否在name小写文本里 mask = file.apply(lambda row: row['company'].lower() in row['name'].lower(), axis=1) # 筛选保留符合条件的行,重置索引避免乱序 file = file[mask].reset_index(drop=True)
方法2:完整单词匹配(可选)
如果需要确保company是作为完整单词出现在name中(比如避免"Apple"被误匹配到"Applesauce"),可以用正则表达式的单词边界:
import re def check_match(row): # 转小写+转义特殊字符,避免正则语法冲突 company = re.escape(row['company'].lower()) name = row['name'].lower() # 正则匹配完整单词(前后是单词边界) return bool(re.search(rf'\b{company}\b', name)) mask = file.apply(check_match, axis=1) file = file[mask].reset_index(drop=True)
内容的提问来源于stack exchange,提问作者MilkyMilk_07
相关产品推荐
相关产品推荐

