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

如何在Pandas列中搜索指定字符串并添加0/1标记列?

解决Pandas中根据字符串匹配生成新列的问题

我来帮你搞定这个问题!你遇到的KeyError和功能失效,主要是因为函数里的逻辑写法出了问题,咱们一步步拆解,然后给出简单高效的解决方案。

先说说你现有代码的问题

你的函数里有几个明显的错误:

  • table[table['Column A']]这种写法完全不对:table['Column A']是一个Series(单列数据),用它去索引DataFrame,会把Series里的字符串当成列名去查找,自然会抛出KeyError。
  • 用in来匹配正则表达式:'company.*?one' in ...是做精确子串匹配,不是正则匹配,根本达不到你要的匹配"company one"或"companyone"的效果。
  • 整列赋值逻辑错误:你直接给整个Branded列赋值1或0,而不是根据每行的匹配结果分别赋值,这完全不符合需求。

正确的解决方案(推荐两种高效写法)

Pandas提供了非常方便的向量化字符串操作,比逐行处理效率高得多,这里给你两种常用的方法:

方法1:用str.contains + 正则 + 类型转换

直接通过正则匹配目标字符串,再把布尔结果转成1/0:

import pandas as pd

# 假设你的DataFrame名为df
df['Branded'] = df['Column A'].str.contains(r'company\s*one', regex=True).astype(int)
  • r'company\s*one':这个正则表达式可以完美匹配"company one"(中间有空格)、"companyone"(无空格),甚至中间有多个空格的情况(比如"company one"),\s*表示0个或多个空白字符。
  • regex=True:告诉Pandas我们要用正则匹配,不是普通子串。
  • astype(int):把匹配得到的布尔值(True/False)转换成整数1/0,正好符合你要的Branded列格式。

方法2:用numpy.where实现条件赋值

如果觉得逻辑更直观,可以用numpy.where来明确指定匹配成功和失败的返回值:

import pandas as pd
import numpy as np

df['Branded'] = np.where(df['Column A'].str.contains(r'company\s*one', regex=True), 1, 0)

这个写法的逻辑是:如果Column A匹配到目标正则,就返回1,否则返回0,和方法1的效果完全一致。

测试验证

用你给出的测试数据运行上面的代码后,得到的Branded列就是你期望的结果:

Column AColumn BColumn CBranded
company one3140.91
company one toast1900.31
www.companyone3800.871
companyone home8500.11
toaster supplies11000.50
toast rack2000.70

额外提示

如果需要忽略大小写(比如匹配"Company One"或"COMPANYONE"),可以给str.contains加上case=False参数:

df['Branded'] = df['Column A'].str.contains(r'company\s*one', regex=True, case=False).astype(int)

内容的提问来源于stack exchange,提问作者jceg316

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:20:52