如何在pyspark中使用具有句点的列的fillna函数

z8dt9xmd  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(830)

我试图运行fillna在列中插入带有特殊字符“.”的nan

df = spark.createDataFrame(
    [(None, None), ('U1', None), ('U3', 1.0)], 
    ['USER_ID', 'a.b']
)

我试过了

df = df.fillna({"`a.b`": float("nan")})

df = df.fillna({"a.b": float("nan")})

两个都不行,谁有这方面的经验?

vojdkbi0

vojdkbi01#

这似乎是有限制的 pyspark.sql.DataFrame.fillna() 这不允许您在使用 value 参数作为字典。
从文档中:
value–用int、long、float、string、bool或dict.值替换空值。如果值是dict,则忽略子集,并且值必须是从列名(字符串)到替换值的Map。替换值必须是int、long、float、boolean或string。
你应该可以使用 fillna 使用指定 value 以及 subset 参数。

df.fillna(value=float("nan"), subset=["a.b"]).show()

# +-------+---+

# |USER_ID|a.b|

# +-------+---+

# |   null|NaN|

# |     U1|NaN|

# |     U3|1.0|

# +-------+---+

上面这些在Spark2.4中对我有用,但我不明白为什么它不能在旧版本上工作。
如果仍然有问题,另一种方法是临时重命名列,调用 fillna ,然后将列重命名回原始值:
在这里,我将重命名列以替换 "." 用绳子 "_DOT_" ,我特意选择它以避免与其他列名中现有的子字符串冲突。

df.toDF(*[c.replace(".", "_DOT_") for c in df.columns])\
    .fillna({"a_DOT_b": float("nan")})\
    .toDF(*df.columns)\
    .show()

# +-------+---+

# |USER_ID|a.b|

# +-------+---+

# |   null|NaN|

# |     U1|NaN|

# |     U3|1.0|

# +-------+---+
wwtsj6pe

wwtsj6pe2#

这是有效的。

df = spark.createDataFrame([(None, None), ('U1', None), ('U3', 1.0)], ['USER_ID', 'a.b'])
df = df.fillna(float("nan"), ['`a.b`'])
df.show(10, False)

+-------+---+
|USER_ID|a.b|
+-------+---+
|null   |NaN|
|U1     |NaN|
|U3     |1.0|
+-------+---+

相关问题