如果用户定义函数中的语句不起作用

Posted

技术标签:

【中文标题】如果用户定义函数中的语句不起作用【英文标题】:If statement in user defined function not working 【发布时间】:2020-10-05 04:02:03 【问题描述】:

我有以下数据框:

    SGCODE                  X            Y
0   T0IQ00000000017200015   27.687276   -26.001460
1   T0IQ00000000017200022   27.699453   -26.003298
2   T0IQ00000000017800128   27.753478   -26.047500

使用用户定义的函数:

def haversine_distance(lat1, lon1, lat2, lon2, rlim):
    r = 6371
    phi1 = np.radians(lat1)
    phi2 = np.radians(lat2)
    delta_phi = np.radians(lat2 - lat1)
    delta_lambda = np.radians(lon2 - lon1)
    a = np.sin(delta_phi / 2)**2 + np.cos(phi1) * np.cos(phi2) *   np.sin(delta_lambda / 2)**2
    res = r * (2 * np.arctan2(np.sqrt(a), np.sqrt(1 - a)))
    if rlim >= res:
        return np.round(res, 2)

当我尝试在 df 上使用 if 语句运行该函数时,我收到以下错误。当我删除 if 语句时,它工作正常并且我得到了输出,我是否遗漏了 if 语句语法中的一些明显内容?

distances_km = []
for row in sample_unq_sg_codes_latlong.itertuples(index=False):
   distances_km.append(
       haversine_distance(sample_unq_sg_codes_latlong["X"], sample_unq_sg_codes_latlong["Y"], row.X, row.Y,5)
   )
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

但是,当我运行该函数的单次迭代时,它会起作用:

haversine_distance(27.687276, -26.001460, 27.699453, -26.003298,5)
1.37

【问题讨论】:

【参考方案1】:

我认为您应该在 if 语句中添加断点,或者至少打印出 rlim 和 res。可能您的问题是 res 和 rlim 不是 int 或 float,而是 array 或其他东西。

长话短说:检查您正在竞争的 2 件事的类型,并确保该比较的结果是布尔型(而不是系列)

【讨论】:

感谢@konserw 的帮助,我明白了。我添加了以下行:'res2= float(res)' 以确保比较类型相同。在确保结果类型方面,如何确保它是 bool 而不是系列? 如果计算 2 个浮点数的结果肯定是 bool;在比较其他类型时,您需要检查这些类型的文档(例如数组)。您还可以将比较结果存储在变量中,并使用 isinstance(var, bool) 检查其类型或使用 print(type(var)) 进行打印类型【参考方案2】:

你可能会得到 numpy 数组作为 'if' 的条件。

rlim 和 res 中的任何一个都是 np 数组,那么比较的结果也将是 numpy 数组。

这就是为什么它要求您使用任何(任何一个真)或全部(全真)作为“如果”的条件。

【讨论】:

以上是关于如果用户定义函数中的语句不起作用的主要内容,如果未能解决你的问题,请参考以下文章

pyspark:用于确定 NaN 或 Null 的用户定义函数不起作用

mysql过程中的更新语句不起作用

如果循环中的语句不起作用[重复]

带有数组的函数不起作用

为啥我的简单 if 语句不起作用?

转换日期用户定义的函数不起作用