df5
award_id_fain award_id_uri loan_no
1234 1234
12345678:4 12345678
我正在使用一个函数来捕获字符串中字符之前的部分。我有一个带有目标值“ award_id_uri”列的df。给定12345678:4,我希望输出为12345678。我想我的语法已经降低,但是我得到了
"'str' object has no attribute 'str'"
错误消息。
我当前的方法是声明一个函数然后应用它。函数和调用如下。
def loan_cap(row):
if pd.notnull(row['award_id_fain']):
loan_no = row['award_id_fain']
else: loan_no = row['award_id_uri'].str.split(':').str[0]
return loan_no
df5['loan_no'] = df5.apply(loan_cap, axis = 1)
我认为错误在于函数的str [0]部分。预先感谢您的帮助。
答案 0 :(得分:1)
如果可能,请避免使用apply
,请尝试从整个系列的角度考虑,而不是逐行考虑。在这种情况下,您可以使用fillna()
:
df['loan_no'] = df.award_id_fain.fillna(df.award_id_uri.str.split(':', expand=True)[0])
输出:
award_id_fain award_id_uri loan_no
0 1234.0 NaN 1234
1 NaN 12345678:4 12345678
答案 1 :(得分:0)
改为这样做。
def loan_cap(row):
if row['award_id_fain']:
return row['award_id_fain']
else:
return row['award_id_uri'].split(':')[0]
df5['loan_no'] = df5.apply(loan_cap, axis = 1)
如其他注释所述,row [“ award_id_uri”]将返回一个值,在您的情况下为字符串,因此您可以直接在其上应用split函数。
如果row ['award_id_uri']不包含“:”,则添加一个try / except块。
答案 2 :(得分:0)
我认为您在这里不需要.str
部分。它说已经知道,它是str
。
尝试:
def loan_cap(row):
if pd.notnull(row['award_id_fain']):
loan_no = row['award_id_fain']
else: loan_no = row['award_id_uri'].split(':').str[0]
return loan_no
答案 3 :(得分:0)
尝试:
row['award_id_uri'].split(':')[0]
row['award_id_uri']
评估为您调用.str
的字符串,因此您会收到错误消息。
为说明尝试:
"this is a string".split(" ")
和
"this is a string".str.split(" ")