首页 > 解决方案 > Pandas/Python 函数 str.contains 返回错误

问题描述

我正在尝试创建一个函数,将我的数据框输入其中 - 该函数的目的是将帐户过帐分类为“接受”或“忽略”。

然后我遇到的问题是,在某些帐户上,我只需要查找文本字符串的一部分。如果我在没有函数的情况下这样做,它会起作用,但在函数中我会收到错误。

所以这很好用:

ekstrakt.query("Account== 'Car_sales'").Tekst.str.contains("Til|Fra", na=False)

但这不会:

def cleansing(df):

    if df['Account'] == 'Car_sales':
        if df.Tekst.str.contains("Til|Fra", na=False)  : return 'Ignore'

ekstrakt['Ignore'] = ekstrakt.apply(cleansing, axis = 1)

它导致错误:“AttributeError:'str'对象没有属性'str'”

之后我需要“清理”功能来获取更多参数,但我正在努力通过第一部分。

标签: pythonpandasfunction

解决方案


如果使用单独处理每一行的函数,则不能使用 pandas 函数处理str.contains.

可能的解决方案是通过链式掩码创建新列,&按位AND使用numpy.where

df = pd.DataFrame({'Account':['car','Car_sales','Car_sales','Car_sales'],
                   'Tekst':['Til','Franz','Text','Tilled']})

m1 = df['Account'] == 'Car_sales'
m2 = df.Tekst.str.contains("Til|Fra", na=False)
df['new'] = np.where(m1 & m2, 'Ignore', 'Accept')
print (df)
     Account   Tekst     new
0        car     Til  Accept
1  Car_sales   Franz  Ignore
2  Car_sales    Text  Accept
3  Car_sales  Tilled  Ignore

如果需要在函数中处理,您可以使用in语句 with or,因为使用标量:

def cleansing(x):

    if x['Account'] == 'Car_sales':
        if pd.notna(x.Tekst):
            if ('Til' in x.Tekst) or ('Fra' in x.Tekst):
                return 'Ignore'


df['Ignore'] = df.apply(cleansing, axis = 1)

print (df)
     Account   Tekst     new  Ignore
0        car     Til  Accept    None
1  Car_sales   Franz  Ignore  Ignore
2  Car_sales    Text  Accept    None
3  Car_sales  Tilled  Ignore  Ignore

推荐阅读