问题描述
我试图运行fillna以将nan插入带有特殊字符“。”的列中。
df = spark.createDataFrame(
[(None,None),('U1',('U3',1.0)],['USER_ID','a.b']
)
我尝试过
df = df.fillna({"`a.b`": float("nan")})
也
df = df.fillna({"a.b": float("nan")})
他们两个都不起作用,谁对此有经验?
解决方法
这正在工作。
df = spark.createDataFrame([(None,None),('U1',('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|
+-------+---+
,
pyspark.sql.DataFrame.fillna()
似乎有一个局限性,当您使用value
参数作为字典时,不允许您在其中指定带有句点的列名。
从文档中
值 –整型,整型,浮点型,字符串型,布尔型或字典型。用于替换空值的值。如果值是字典,则 subset 会被忽略,并且 value 必须是从列名(字符串)到替换值的映射。替换值必须是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|
#+-------+---+
以上内容适用于Spark 2.4,但我不明白为什么它不适用于旧版本。
如果仍然遇到问题,另一种方法是暂时rename your columns,调用fillna
,然后将列重命名为原始值:
在这里,我将rename the columns替换为"."
的字符串"_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|
#+-------+---+