примените функцию к значениям nan и получите UnboundLocalError: локальная переменная ‘val’, на которую ссылались перед назначением

#python #pandas

Вопрос:

У меня есть файл со столбцом с именем logo, в некоторых строках указан путь к изображению, а некоторые строки пусты. Я хочу заполнить пустые строки одной картинкой, и вот мой код, и я получил ошибку UnboundLocalError: локальная переменная ‘val’, на которую ссылались перед назначением

 def g(row):
    if row['logo'] == np.nan:
        val = str(r"pathyellow_m.png")
    else:
        pass
    return val
 
 operator['logo'] = operator.apply(g, axis=1)
 
 ---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-17-261a706495c6> in <module>
----> 1 operator['logo'] = operator.apply(g, axis=1)

~anaconda3libsite-packagespandascoreframe.py in apply(self, func, axis, raw, result_type, args, **kwds)
   7546             kwds=kwds,
   7547         )
-> 7548         return op.get_result()
   7549 
   7550     def applymap(self, func) -> "DataFrame":

~anaconda3libsite-packagespandascoreapply.py in get_result(self)
    178             return self.apply_raw()
    179 
--> 180         return self.apply_standard()
    181 
    182     def apply_empty_result(self):

~anaconda3libsite-packagespandascoreapply.py in apply_standard(self)
    269 
    270     def apply_standard(self):
--> 271         results, res_index = self.apply_series_generator()
    272 
    273         # wrap results

~anaconda3libsite-packagespandascoreapply.py in apply_series_generator(self)
    298                 for i, v in enumerate(series_gen):
    299                     # ignore SettingWithCopy here in case the user mutates
--> 300                     results[i] = self.f(v)
    301                     if isinstance(results[i], ABCSeries):
    302                         # If we have a view on v, we need to make a copy because

<ipython-input-16-1de3acee1278> in g(row)
      4     else:
      5         pass
----> 6     return val

UnboundLocalError: local variable 'val' referenced before assignment
 

Комментарии:

1. Если ваша функция val не определена для else случаев.

2. val определяется только в том случае, если row['logo'] его нет. Если вы хотите использовать то, что есть в row['logo'] if, если это не None, вам нужно сделать val = row['logo'] это в else предложении.

Ответ №1:

если ваш код столкнулся с else, val не вызывается.

 def g(row):
if row['logo'] == np.nan:
    val = str(r"pathyellow_m.png")
    return val
else:
    pass
 

Ответ №2:

Проблема в том, что return val функция будет возвращаться val независимо от того, val определена она или нет. если if оператор принимает значение False, то он переходит в else . Но else ничего не делает из-за pass этого .

val определяется только в том случае, если row['logo'] это None Тип. Но если это не так, то это переходит в else утверждение.

Теперь return Вэл казнен. Но val не определено. Так что это Ошибка.

 def g(row):
    if row['logo'] == np.nan:
        val = str(r"pathyellow_m.png")
        return val
    else:
        pass