微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

熊猫/ Python函数str.contains返回错误

如何解决熊猫/ 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'”

我需要“清理”功能以在以后接受更多参数,但是我正在努力超越第一部分。

解决方法

如果使用函数分别处理每一行,则不能使用pandas functon处理str.contains之类的列。

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

df = pd.DataFrame({'Account':['car','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

如果需要在函数中进行处理,则可以将inor一起使用,因为使用标量:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。