PySpark如何将列中的null值替换为另一列中的值?

36

我希望用相邻列的值替换一个列中的空值,例如如果我有:

A|B
0,1
2,null
3,null
4,2

我希望它变成:

A|B
0,1
2,2
3,3
4,2

尝试过

df.na.fill(df.A,"B")

但是没有起作用,它说值应该是float、int、long、string或dict。

有什么想法吗?

4个回答

72

我们可以使用 coalesce


from pyspark.sql.functions import coalesce
    
df.withColumn("B",coalesce(df.B,df.A)) 

3
这个解决方案缺少 from pyspark.sql.functions import coalesce - user8276908

17

另一个答案。

如果下面的df1是您的数据框:

rd1 = sc.parallelize([(0,1), (2,None), (3,None), (4,2)])
df1 = rd1.toDF(['A', 'B'])

from pyspark.sql.functions import when
df1.select('A',
           when( df1.B.isNull(), df1.A).otherwise(df1.B).alias('B')
          )\
   .show()

3
df.rdd.map(lambda row: row if row[1] else Row(a=row[0],b=row[0])).toDF().show()

谢谢,最后我使用了coalesce: df.withColumn("B",coalesce(df.B,df.A)) 但是你的回答对于其他人尝试这个也很有帮助。 - Luis Leal

0

注意:coalesce 不会 替换NaN值,只替换null

import pyspark.sql.functions as F

>>> cDf = spark.createDataFrame([(None, None), (1, None), (None, 2)], ("a", "b"))
>>> cDf.show()
+----+----+
|   a|   b|
+----+----+
|null|null|
|   1|null|
|null|   2|
+----+----+

>>> cDf.select(F.coalesce(cDf["a"], cDf["b"])).show()
+--------------+
|coalesce(a, b)|
+--------------+
|          null|
|             1|
|             2|
+--------------+


现在让我们创建一个带有None条目的pandas.DataFrame,将其转换为spark.DataFrame并再次使用coalesce
>>> cDf_from_pd = spark.createDataFrame(pd.DataFrame({'a': [None, 1, None], 'b': [None, None, 2]}))
>>> cDf_from_pd.show()
+---+---+
|  a|  b|
+---+---+
|NaN|NaN|
|1.0|NaN|
|NaN|2.0|
+---+---+

>>> cDf_from_pd.select(F.coalesce(cDf_from_pd["a"], cDf_from_pd["b"])).show()
+--------------+
|coalesce(a, b)|
+--------------+
|           NaN|
|           1.0|
|           NaN|
+--------------+


在这种情况下,您需要首先调用 replace 函数来将您的 DataFrame 中的 NaN 转换为 null

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接