为了账号安全,请及时绑定邮箱和手机立即绑定

在函数内部定义全局时出现 UnboundLocalError

在函数内部定义全局时出现 UnboundLocalError

慕神8447489 2023-07-27 15:48:31
我知道这是一个非常常见的错误,但我可以找到我的错误。我有带有周边数据的数据框,例如:>>>name    perimeter0  al      24.51  dl      43.72  yl      1222.43  pl      213.24  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 valdf['perimeter_warning'] = df.apply(z,axis=1)由于某种原因,即使我在函数内使用全局,我仍然收到此错误:UnboundLocalError:赋值前引用的局部变量“val”我做错了什么?我预计将其定义为全局将解决问题。
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

尝试在代码中添加另一种场景,其中

if row['perimeter'] == per_median: 然后为 val 设置一些值。

或者,如果您不想处理此问题,请在使用之前尝试为 val 分配默认值。


查看完整回答
反对 回复 2023-07-27
?
万千封印

TA贡献1891条经验 获得超3个赞

缺少处理row['perimeter']等于的情况,因此未设置变量。per_medianval


编辑代码来处理这种情况:


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


查看完整回答
反对 回复 2023-07-27
  • 2 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信