我想在熊猫表中应用模式识别,并在作者姓名与特定模式匹配时将其代码设置为有效。但是,我只得到不正确的值。我正在迭代每一行,但我想只在相应的单元格值为0时才应用lambda函数。
Author valid
Andi 0
Tomasius 0
Anke 0
这是我的代码:
df["valid"] =0
def author_check(x, y):
if str(x) == y:
return 1
else:
return 0
import re
author_list =["Andi","Tomasius"]#]
regex_list = [".*nd*"]
for i in range(len(author_list)):
for x in range(len(regex_list)):
r = re.compile(regex_list[x])
newlist = filter(r.match, author_list)
x = len(list(newlist))
if x>0:
df['brand'] = df.apply(lambda row: author_check(row['Author'], author_list[i]), axis=1 )
一旦我运行了这个,我得到了
Author valid
Andi 0
Tomasius 1
Anke 0
但我想要
Author valid
Andi 1
Tomasius 0
Anke 0
我做错了什么?任何提示都会非常感激!
干杯, 岸堤
答案 0 :(得分:0)
你有一些问题。首先,您的正则表达式将匹配Andi
和Anke
,因为.*nd*
基本上是说#34;匹配0个或更多非换行符,{{1字符,以及0个或更多n
个字符"。其次,使用循环并不能充分利用Panda的功能。相反,我建议使用np.where()
和str.contains()
以更快,更简洁的方式执行您的功能。
使用示例数据框:
d
以下代码将为您提供所需内容:
df = pd.DataFrame({'Author': ['Andi', 'Tomasius', 'Anke'], 'valid': [0, 0, 0]})
如果您的查询更复杂并且需要正则表达式(根据您的评论),您也可以使用它:
df['valid'] = np.where(df.Author.str.contains('nd'), 1, 0)