Как сравнить пару столбцов, используя udf в pyspark? - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть датафрейм, как показано ниже

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

Я хочу сравнить каждый столбец с другим столбцом.

например t1 значение столбца 0 и t2 значение столбца равно 1, комбинация t1 and t2 столбец равен 1.

мы должны применить logical oR для всех пар столбцов.

мой ожидаемый результат будет как ниже:

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

пожалуйста, помогите мне в этом.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Для 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|
+----+---+---+---+
0 голосов
/ 04 ноября 2018

Попробуйте это,

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, как вам нужно, с помощью transpose
  3. Выполнить логическое ИЛИ в обоих df

Выход:

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