Элементы Str.split не существуют при использовании в функции с использованием строки - PullRequest
0 голосов
/ 21 октября 2019

df5

award_id_fain    award_id_uri    loan_no
1234                             1234
                 12345678:4      12345678

Я использую функцию для захвата частей строки, которые предшествуют символу. У меня есть df со столбцом "award_id_uri" целевых значений. Дано 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 ]

1 голос
/ 21 октября 2019

Избегайте 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
0 голосов
/ 21 октября 2019

Я думаю, вам здесь не нужна часть .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
0 голосов
/ 21 октября 2019

try: row['award_id_uri'].split(':')[0]

row['award_id_uri'] оценивается как строка, которую вы вызываете .str, так что вы получите ошибку.

Для иллюстрации попробуйте: "this is a string".split(" ") и "this is a string".str.split(" ")

0 голосов
/ 21 октября 2019

Сделайте это так вместо этого.

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)

Как уже упоминалось в других комментариях, строка ["award_id_uri"] будет возвращать значение, в вашем случае это строка, поэтому вы можете напрямую применить к ней свою функцию разбиения.

Примечание

Добавить блок try / исключение, если строка ['ward_id_uri '] не содержит ":".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...