我有一个带有这样的列表列表值的PySpark列
row 1: [['01', '100.0'], ['01', '400.0'], [None, '0.0'], ['06', '0.0'], ['01', '300'], [None, '0.0'], ['06', '200.0']]
row 2: [[None, '200.0'], ['06', '300.0'], ['01', '500'], ['06', '100.0'], ['01', '200'], ['07', '50.0']]
我需要比较列表中第一个元素相同的元素,并过滤掉每对中第二个元素最大的数组。尽管数组的第一个元素可能具有不同的代码,但我想过滤出包含'01','06'或'07'的数组元素,并在数据框中添加两列。
因此,上面的示例行的结果如下所示:
[['01', '400.0'], ['06', '200.0'], ['07':'0']
[['01', '500.0'], ['06', '300.0'], ['07':'50']
最有效的方法是什么?
应该这样做:
from pyspark.sql import functions as F
df.withColumn("Max_01",F.when(F.size(F.expr("""filter(arr,x-> exists(x,y->y='01'))"""))!=0,
F.expr("""array_max(transform(filter(arr, x-> exists(x,y-> y='01')),z-> float(z[1])))"""))\
.otherwise(F.lit(0)))\
.withColumn("Max_06",F.when(F.size(F.expr("""filter(arr,x-> exists(x,y->y='06'))"""))!=0,
F.expr("""array_max(transform(filter(arr, x-> exists(x,y-> y='06')),z-> float(z[1])))"""))\
.otherwise(F.lit(0)))\
.withColumn("Max_07",F.when(F.size(F.expr("""filter(arr,x-> exists(x,y->y='07'))"""))!=0,
F.expr("""array_max(transform(filter(arr, x-> exists(x,y-> y='07')),z-> float(z[1])))"""))\
.otherwise(F.lit(0)))\
.show(truncate=False)
#+---------------------------------------------------------------------------------+------+------+------+
#|arr |Max_01|Max_06|Max_07|
#+---------------------------------------------------------------------------------+------+------+------+
#|[[01, 100.0], [01, 400.0], [, 0.0], [06, 0.0], [01, 400.0], [, 0.0], [06, 200.0]]|400.0 |200.0 |0.0 |
#|[[, 200.0], [06, 300.0], [01, 500], [06, 100.0], [01, 200], [07, 50.0]] |500.0 |300.0 |50.0 |
#+---------------------------------------------------------------------------------+------+------+------+
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句