PySpark-基于条件的Fillna特定行

时间:2019-08-09 18:23:25

标签: python-3.x apache-spark pyspark azure-databricks

我想替换数据框中的空值,但只替换符合特定条件的行。

我有这个数据框:

A|B   |C   |D   |
1|null|null|null|
2|null|null|null|
2|null|null|null|
2|null|null|null|
5|null|null|null|

我要这样做:

A|B   |C   |D   |
1|null|null|null|
2|x   |x   |x   |
2|x   |x   |x   |
2|x   |x   |x   |
5|null|null|null|

我的案子

因此,在A列中编号为2的所有行都应替换。

A,B,C,D列是动态的,它们的数字和名称将更改。

我还希望能够选择所有行,而不仅仅是被替换的行。

我尝试过的事情

我尝试使用df.where和fillna,但是它不能保留所有行。

虽然我也要处理withColumn,但我只知道A列,其他所有列在每次执行时都会更改。

适应的解决方案:

 df.select("A",
             *[
                 when(col("A") == '2', 
                    coalesce(col(c),
                    lit('0').cast(df.schema[c].dataType))
                 ).otherwise(col(c)).alias(c) 
                 for c in cols_to_replace
               ])

1 个答案:

答案 0 :(得分:1)

pyspark.sql.functions.whenpyspark.sql.functions.coalesce一起使用:

CREATE STREAM A_Enriched_Phase7
WITH(PARTITIONS=1)
AS
SELECT *
FROM A_Enriched_Phase6 a
    JOIN KsqlTableD d ON a.X = d.X
PARTITION BY a.ID; 

在列表推导中,您检查from pyspark.sql.functions import coalesce, col, lit, when cols_to_replace = df.columns[1:] df.select( "A", *[ when(col("A")==2, coalesce(col(c), lit("x"))).otherwise(col(c)).alias(c) for c in cols_to_replace ] ).show() #+---+----+----+----+ #| A| B| C| D| #+---+----+----+----+ #| 1|null|null|null| #| 2| x| x| x| #| 2| x| x| x| #| 2| x| x| x| #| 5|null|null|null| #+---+----+----+----+ 的值是否为A。如果是,则合并该列的值和文字2。这会将x替换为null。否则,请保持相同的列值。