已编辑 下面只是df的示例,我需要一个可扩展的解决方案。实际的df有30多个列(p1,p2,p3等)。
我有这样的df-
+---+---+----+
| id| p1| p2 |
+---+---+------
|foo|[1]| null|
|bar|[2]| [2] |
|loo|[3]| [4] |
+---+---+-----+
我想要这样的输出-
+---+---+----+--------+
| id| p1| p2 | concat |
+---+---+------+------+
|foo|[1]| null| [1] |
|bar|[2]| [2] | [2] |
|loo|[3]| [4] | [3,4]|
+---+---+-----+--------
因此,新列concat将仅保存p1和p2列中的唯一值 我已经在pyspark中尝试了F.concat()方法,但是没有给出期望的结果。 任何帮助表示赞赏。
谢谢
答案 0 :(得分:0)
如果要确定值的唯一性,请使用以下代码。我使用了lambda函数来分析所有DataFrame行,并声明check_unique_vlaues(),它返回所分析行的唯一值。
def check_unique_vlaues(first, second):
if first == second:
return first
else:
return [first, second]
df['p3'] = df.apply(lambda x: check_unique_vlaues(x.p1, x.p2), axis=1)
编辑:
要不首先获得行中所有列的唯一值,我们可以使用unique()
函数,该函数可用于pandas系列。
def func(row):
row = row[1:]
return row.unique()
df['concat'] = df.apply(lambda x: func(x), axis=1)
答案 1 :(得分:0)
如果您有Spark 2.4+,则可以使用array
函数
df.withColumn("concat", F.array_union(df.p1, df.p2))\
.withColumn("concat", F.array_distinct(df.concat)).show()
对于Spark 2.3及更低版本,
from pyspark.sql import functions as F
def concat_array(col1, col2):
return list(set((list() if col1 is None else col1) + (list() if col2 is None else col2)))
concat_array_udf = F.udf(concat_array, ArrayType(IntegerType()))
df.withColumn('concat', concat_array_udf(df.p1, df.p2)).show()
+---+---+----+------+
| id| p1| p2|concat|
+---+---+----+------+
|foo|[1]|null| [1]|
|bar|[2]| [2]| [2]|
|loo|[3]| [4]|[3, 4]|
+---+---+----+------+