我正在尝试创建一个函数,将数据帧输入到该函数中-该函数的目的是将帐户过帐分为“接受”或“忽略”。
我遇到的问题是,在某些情况下,我只需要查找文本字符串的一部分即可。如果我在没有函数的情况下执行此操作,那么它会起作用,但是在函数中会出现错误。
这很好用:
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'”
我需要“清理”功能以在以后接受更多参数,但是我正在努力超越第一部分。
答案 0 :(得分:1)
如果使用函数分别处理每一行,则不能使用pandas functon处理str.contains
之类的列。
可能的解决方案是使用numpy.where
按&
按位掩码AND
通过链掩码创建新列:
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
与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