熊猫 - 迭代行以进行模式识别

时间:2017-10-18 16:20:04

标签: python regex pandas

我想在熊猫表中应用模式识别,并在作者姓名与特定模式匹配时将其代码设置为有效。但是,我只得到不正确的值。我正在迭代每一行,但我想只在相应的单元格值为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

我做错了什么?任何提示都会非常感激!

干杯, 岸堤

1 个答案:

答案 0 :(得分:0)

你有一些问题。首先,您的正则表达式将匹配AndiAnke,因为.*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)