在使用row的函数中使用Str.split元素时不存在

时间:2019-10-21 15:45:57

标签: python pandas

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]部分。预先感谢您的帮助。

4 个答案:

答案 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(" ")