You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:05:15