如何在pyspark中使用udf比较成对的列?

时间:2018-11-03 21:44:24

标签: pandas apache-spark pyspark apache-spark-sql pyspark-sql

我有如下所示的数据框

+---+---+---+
| t1| t2|t3 |
+---+---+---+
|0  |1  |0  |
+---+---+---+

我想将每一列与另一列进行比较。

例如t1列值0t2列值是1t1 and t2组合列是1

我们必须对所有列对应用logical oR

我的预期输出如下:

+----+---+---+---+
|t123| t1|t2 | t3|
+----+---+---+---+
|t1  |0  |1  |0  |
|t2  |1  |0  |1  |
|t2  |0  |1  |0  |
+----+---+---+---+

请帮助我。

2 个答案:

答案 0 :(得分:1)

尝试一下

cols=df.columns
n=len(cols)
df1=pd.concat([df]*n,ignore_index=True).eq(1)
df2= pd.concat([df.T]*n,axis=1,ignore_index=True).eq(1)
df2.columns=cols
df2=df2.reset_index(drop=True)
print (df1|df2).astype(int)

说明:

  1. 根据需要将df1转换为逻辑df
  2. 通过转置将df2转换为逻辑df
  3. 在两个df中执行逻辑或

输出:

   t1  t2  t3
0   0   1   0
1   1   1   1
2   0   1   0

答案 1 :(得分:0)

对于pyspark,您可以创建一个空的df,然后根据列将其插入循环中。以下不仅适用于3列,而且适用于更多列

>>> import pyspark.sql.functions as F
>>> 
>>> df1 = spark.createDataFrame(sc.emptyRDD(), df.schema)
>>> df.show()
+---+---+---+
| t1| t2| t3|
+---+---+---+
|  0|  1|  0|
+---+---+---+

>>> df1 = spark.createDataFrame(sc.emptyRDD(), df.schema)
>>> df1 = df1.select(F.lit('').alias('t123'), F.col('*'))
>>> df1.show()
+----+---+---+---+
|t123| t1| t2| t3|
+----+---+---+---+
+----+---+---+---+

>>> for x in df.columns: 
...     mydf = df.select([(F.when(df[i]+df[x]==1,1).otherwise(0)).alias(i) for i in df.columns])
...     df1 = df1.union(mydf.select(F.lit(x).alias('t123'), F.col('*')))
... 
>>> df1.show()
+----+---+---+---+
|t123| t1| t2| t3|
+----+---+---+---+
|  t1|  0|  1|  0|
|  t2|  1|  0|  1|
|  t3|  0|  1|  0|
+----+---+---+---+