作为简化示例,我有一个数据框:
name index x y speed
a 1 12.5 14 1,0
a 2 13 14.5 2.2
a 3 13.5 15 3.2
a 4 14 15.5 4.5
a 5 14.5 16 5.6
a 6 15 16.5 7.5
a 7 15.5 17 6.5
b 1 17.5 19 5.5
b 2 18 19.5 6.6
和UDF函数如下:
def dis_calc(cur_idx, *speed_series):
dis=0
for i in range(len(speed_series)):
dis += speed_series[i] * 0.1
if dis > 5:
return cur_idx + i
所以在一个词中我只想找到每行5米的邻居并保存邻居的索引。为此,我必须将最后约50行的速度传递给UDF:dis_calc。 我能做的只是:
w = Window.partitionBy("name").orderBy("index")
udffun = udf(dis_calc)
test_df = test_df.withColumn("neighbor_index", udffun(col("index"), ???))
我怎样填补“???”的位置?
我不是一个好主意:
我可以将整个命令组装成一个字符串并使用eval来执行它,
str_command = "test_df.withColumn("neighbor_index", udffun(col("index"), "
for i in range(50):
str_command += "lag(col("speed"),{}).over(w),".format(i)
str_command = str_command[:-1] + "))"
test_df = eval(str_command)
然而,我知道这绝对是一个坏主意,因为我有时可能需要超过最后50行,可能是100行。
有人有更好的方法来解决这个问题吗?