在pappas数据帧的.apply()中使用for循环

时间:2014-03-18 20:26:05

标签: python pandas

我想删除列表中的所有项目。我已尝试使用以下代码在pandas .apply()的上下文中遍历列表中的所有项目。但是,函数remove(x)似乎只是在remove_l中的第一项。我怎样才能确保它遍历remove_l中的所有项目?

我知道我可以创建单独的if语句,我已经完成了,但是我希望使用for循环来实现,以防列表变长。

remove_l = [r'[A-Za-z]+(?:\/)', r'Today, ', '-']

def remove(x):
    for phrase in remove_l:
        if re.search(phrase, x):
            if phrase == '-':
                new = x.replace(phrase, ' ')
            else: 
                new = x[re.search(phrase, x).span()[1]:].strip()
            return new 
        else: 
            return x


#check up on items 
#60, 330, 347, 411, 647
#idx = nocountries_df[nocountries_df.Name.str.contains('\/')].Name.index
nocountries_df.Name.apply(lambda x: remove(x))

1 个答案:

答案 0 :(得分:2)

这是一个缩进问题,当它遇到第一次返回时(在for循环中)它返回该值:

def remove(x):
    for phrase in remove_l:
        if re.search(phrase, x):
            if phrase == '-':
                new = x.replace(phrase, ' ')
            else: 
                new = x[re.search(phrase, x).span()[1]:].strip()
            return new  # <- returns here (in first phase) 
        else: 
            return x  # <- or returns here (in first phase)

你希望在 for循环之后返回,它可能最简单的只是在for循环中更改 x:

def remove(x):
    for phrase in remove_l:
        if re.search(phrase, x):
            if phrase == '-':
                x = x.replace(phrase, ' ')
            else: 
                x = x[re.search(phrase, x).span()[1]:].strip()
    return x