如何在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 A | Column B | Column C | Branded |
|---|---|---|---|
| company one | 314 | 0.9 | 1 |
| company one toast | 190 | 0.3 | 1 |
| www.companyone | 380 | 0.87 | 1 |
| companyone home | 850 | 0.1 | 1 |
| toaster supplies | 1100 | 0.5 | 0 |
| toast rack | 200 | 0.7 | 0 |
额外提示
如果需要忽略大小写(比如匹配"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
相关产品推荐
相关产品推荐

