除了pyspark之外,有人可以在下面的链接中回答问题吗?
how to fill a column with the value of another column based on a condition on some other columns?
我在这里再次重复这个问题:
假设在pyspark中有一个数据框,如下所示:
col1 | col2 | col3 | col4
22 | null | 23 | 56
12 | 54 | 22 | 36
48 | null | 2 | 45
76 | 32 | 13 | 6
23 | null | 43 | 8
67 | 54 | 56 | 64
16 | 32 | 32 | 6
3 | 54 | 64 | 8
67 | 4 | 23 | 64
如果col4
和col1
不是col4<col1
,我想用col2
替换null
的值
所以结果应该是
col1 | col2 | col3 | col4
22 | null | 23 | 56
12 | 54 | 22 | 36
48 | null | 2 | 45
76 | 32 | 13 | 76
23 | null | 43 | 8
67 | 54 | 56 | 67
16 | 32 | 32 | 16
3 | 54 | 64 | 8
67 | null | 23 | 64
任何帮助将不胜感激。
答案 0 :(得分:0)
这可以解决您的问题:
from pyspark.sql.functions import col, when
condition_col = (col('col4') < col('col1')) & (col('col2').isNotNull())
df = df.withColumn('col4', when(condition_col, col('col1')).otherwise(col('col4')))
when(cond, result1).otherwise(result2)
的作用类似于带有列的if / else子句。
对于列逻辑运算符,对&
使用and
; |
代表or
; ~
代表not
。
答案 1 :(得分:0)
from pyspark.sql.functions import when, col
values = [(22 ,None ,23 , 56), (12, 54, 22, 36), (48 ,None,2 , 45), (76, 32, 13, 6), (23, None, 43, 8),
(67, 54, 56, 64), (16, 32, 32, 6), (3, 54, 64, 8), (67, 4, 23, 64)]
df = sqlContext.createDataFrame(values,['col1','col2','col3','col4'])
df.show()
+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
| 22|null| 23| 56|
| 12| 54| 22| 36|
| 48|null| 2| 45|
| 76| 32| 13| 6|
| 23|null| 43| 8|
| 67| 54| 56| 64|
| 16| 32| 32| 6|
| 3| 54| 64| 8|
| 67| 4| 23| 64|
+----+----+----+----+
df = df.withColumn('col4',when((col('col4')<col('col1')) & col('col2').isNotNull(),col('col1')).otherwise(col('col4')))
df.show()
+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
| 22|null| 23| 56|
| 12| 54| 22| 36|
| 48|null| 2| 45|
| 76| 32| 13| 76|
| 23|null| 43| 8|
| 67| 54| 56| 67|
| 16| 32| 32| 16|
| 3| 54| 64| 8|
| 67| 4| 23| 67|
+----+----+----+----+