我很新兴,无法让它发挥作用......希望有一种简单的方法可以做到这一点...... 我想要做的是下表中最好的描述:(我需要获得“必需”列)
colA colB colC ref required
1 a1 b1 c1 colA a1
2 a2 b2 c2 colA a2
3 a3 b3 c3 colB b3
4 a4 b4 c4 colB b4
5 a5 b5 c5 colC c5
6 a6 b6 c6 colC c6
上面只是一个例子 - 在实例中我有> 50列,所以做条件不会起作用......
我知道这可以通过以下方式在熊猫中轻松完成:
df['required'] = df.apply(lambda x: x.loc[x.ref], axis=1)
或
df['required'] = df.lookup(df.index, df.ref)
有关如何在PySpark中执行此操作的任何建议吗?
答案 0 :(得分:2)
执行此操作的一种方法是使用when
和coalesce
函数:
import pyspark.sql.functions as F
cols = ['colA', 'colB', 'colC']
df.withColumn('required', F.coalesce(*[F.when(df.ref == c, df[c]) for c in cols])).show()
+----+----+----+----+--------+
|colA|colB|colC| ref|required|
+----+----+----+----+--------+
| a1| b1| c1|colA| a1|
| a2| b2| c2|colA| a2|
| a3| b3| c3|colB| b3|
| a4| b4| c4|colB| b4|
| a5| b5| c5|colC| c5|
| a6| b6| c6|colC| c6|
+----+----+----+----+--------+
基本上,您要检查ref
列所属的列名称,并从该列中获取值F.when(df.ref == c, df[c])
;这将创建一个列对象列表,当其名称出现在ref
列中时,其值将保留,否则其值为NULL;然后通过合并列列表,NULL值将填充有效列值中的值。