在 python 中创建一个带有 'while' 循环的函数,并使用该函数在数据框中生成一个新列

Create a Function with 'while' loop in python and use the function to generate a new column in a data frame

我试图在 Python 中用“while”创建一个新函数。

def pmv_calculator(ta, tr, vel, rh, met, clo, wme):
pa = rh * 10 * np.exp(16.6536 - 4030.183 / (ta + 235))
icl = 0.155 * clo
m = met * 58.15
w = wme * 58.15
mw = m - w
if icl <= 0.078:
    fcl = 1 + (1.29 * icl)
else:
    fcl = 1.05 + (0.645 * icl)

hcf = 12.1 * np.sqrt(vel)
taa = ta + 273
tra = tr + 273
tcla = taa + (35.5 - ta) / (3.5 * icl + 0.1)

p1 = icl * fcl
p2 = p1 * 3.96
p3 = p1 * 100
p4 = p1 * taa
p5 = 308.7 - 0.028 * mw + p2 * np.power(tra / 100, 4)
xn = tcla / 100
xf = tcla / 50
eps = 0.00015
hc = 0

n = 0
while abs(xn - xf) > eps:
    xf = (xf + xn) / 2
    hcn = 2.38 * np.power(abs(100.0 * xf - taa), 0.25)
    if hcf > hcn:
        hc = hcf
    else:
        hc = hcn
    xn = (p5 + p4 * hc - p2 * np.power(xf, 4)) / (100 + p3 * hc)
    n += 1
    if n > 150:
        print('Max iteration exceeded')
        break

tcl = 100 * xn - 273
h11 = 3.05 * 0.001 * (5733 - (6.99 * mw) - pa)
if mw > 58.15:
    h12 = 0.42 * (mw - 58.15)
else:
    h12 = 0
h13 = 1.7 * 0.00001 * m * (5867 - pa)
h14 = 0.0014 * m * (34 - ta)
h15 = 3.96 * fcl * (np.power(xn, 4) - np.power(tra / 100, 4))
h16 = fcl * hc * (tcl - ta)
ts = 0.303 * np.exp(-0.036 * m) + 0.028
pmv = ts * (mw - h11 - h12 - h13 - h14 - h15 - h16)

return pmv

然后使用此函数在我的数据框中生成另一列。

df['PMV'] = pmv_calculator(df['temp'], df['temp'], 0.1, 22, 1.1, 1, 0)

但它给我以下错误:

文件“C:/P.py”,第 119 行,在 df['PMV'] = pmv_calculator(df['temp'], df['temp'], Air_Speed, 22, Metabolic_Rate, 服装, 0 ) 文件“C:/P.py”,第 83 行,在 pmv_calculator 中 而 abs(xn - xf) > eps: 文件“C:\PA\venv\lib\site-packages\pandas\core\generic.py”,第 1538 行,在 nonzero 中 f“{type(self).name} 的真值不明确。” ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

当我简单地放置数字而不是数据框列时,该函数工作正常。当我尝试创建一个新列时,错误就出现了。 我用“|”写了“while”循环但它没有用。我不知道如何修复它。

错误是因为这一行

while abs(xn - xf) > eps:

这种类型的比较最适合单个值。但是在一个数据框中你有多个值,所以这是行不通的。 在您的情况下,最好的解决方案是使用 df.apply()。这会将 pmv_calculator 函数单独应用于每一行。

df['PMV'] = df.apply( lambda x : pmv_calculator(x['temp'], x['temp'], 0.1, 22, 1.1, 1, 0), axis=1)