Получение UnboundLocalError при определении global внутри функции

Я знаю, что это очень ошибка cmmon, но я могу найти свою ошибку. У меня есть кадр данных с данными периметра, например:

>>>name    perimeter
0  al      24.5
1  dl      43.7
2  yl      1222.4
3  pl      213.2
4  kl      120
...

Я хочу проверить средний периметр, а затем добавить новый столбец в соответствии со средним значением периметра. Я определяю медиану перед функцией, а затем определяю медиану как глобальную внутри функции:

per_median=df['perimeter'].median()

def z(row):
    global per_median
    if row['perimeter'] > per_median:
        val = 'yes'
    elif row['perimeter'] < per_median:
        val = 'no'
    return val

df['perimeter_warning'] = df.apply(z,axis=1)

по какой-то причине, хотя я использую global внутри функции, я продолжаю получать эту ошибку:

UnboundLocalError: ссылка на локальную переменную 'val' перед назначением

Что я делаю неправильно? Я ожидал, что определение его как глобального решит проблему.


person Reut    schedule 10.09.2020    source источник


Ответы (2)


arrow_upward
1
arrow_downward

Попробуйте добавить еще один сценарий в код, где

if row['perimeter'] == per_median: Затем установите некоторое значение для val.

Или, если вы не хотите с этим справляться, попробуйте присвоить значение по умолчанию для val перед его использованием.

person Mahesh Anakali    schedule 10.09.2020

arrow_upward
0
arrow_downward

Обработка случая, когда row['perimeter'] равно per_median, отсутствовала, поэтому переменная val не была установлена.

Отредактировал код для обработки этого сценария:

import pandas as pd
import numpy as np


df = pd.DataFrame({'name':['al', 'dl', 'yl', 'pl', 'kl'],
'perimeter':[24.5, 43.7, 1222.4, 213.2, 120]})


per_median=df['perimeter'].median()

def z(row):
    global per_median
    if row['perimeter'] > per_median:
        val = 'yes'
    elif row['perimeter'] < per_median:
        val = 'no'
    else:
        val = 'equals'
    return val

df['perimeter_warning'] = df.apply(z,axis=1)

print(df)

Выход:

  name  perimeter perimeter_warning
0   al       24.5                no
1   dl       43.7                no
2   yl     1222.4               yes
3   pl      213.2               yes
4   kl      120.0            equals
person Aviv Yaniv    schedule 10.09.2020