python - 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'”
之后我需要“清理”功能来获取更多参数,但我正在努力通过第一部分。
解决方案
如果使用单独处理每一行的函数,则不能使用 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
推荐阅读
- optimization - 使用 mystic 解决参数相关的优化问题
- css - 扩展元素 CSS 时背景消失?
- prometheus - PromQL:rate() 函数的用途是什么?
- c# - 应该将 .csproj 文件添加到 .gitignore 吗?
- if-statement - 我删除“ } else { } ”但代码仍然正确?
- python - 根据值的四分位数范围在新列中分配标签
- python - Pandas Dataframe - 在字符串中查找字符串的出现
- typescript - Vuex + Typescript:突变对象有效载荷始终未定义
- r - 在R中的data.frames列表中使用一个data.frame的指定列
- c# - Azure Active Directory Login Getting Claims 希望从本地数据库添加更多声明