我想替换数据框中的空值,但只替换符合特定条件的行。
我有这个数据框:
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
])
答案 0 :(得分:1)
将pyspark.sql.functions.when
与pyspark.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
。否则,请保持相同的列值。