如果用户定义函数中的语句不起作用
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 数组。
这就是为什么它要求您使用任何(任何一个真)或全部(全真)作为“如果”的条件。
【讨论】:
以上是关于如果用户定义函数中的语句不起作用的主要内容,如果未能解决你的问题,请参考以下文章