使用带有熊猫数据的 CreateDataFrame 时将 NaN 替换为 null

Posted

技术标签:

【中文标题】使用带有熊猫数据的 CreateDataFrame 时将 NaN 替换为 null【英文标题】:Replace NaN with null when using CreateDataFrame with pandas data 【发布时间】:2021-08-18 10:43:24 【问题描述】:

我正在读取 csv,将其转换为 Spark 数据帧,然后进行一些聚合。原始 csv 有缺失数据,通过 Pandas 读取时表示为NaN。转换为 PySpark 后,NaN 值将保留,而不是被 null 替换。这导致我的 .avg() 聚合具有 NaN 值。

df = pd.read_csv('data.csv', index_col = False)

spark_schema = StructType([
    StructField("id",StringType(),True),
    StructField("segment", StringType(), True),
    StructField("score",DoubleType(),True),
    StructField("sales", IntegerType(), True)
  ])

spark_df = spark.createDataFrame(data=df,schema=spark_schema).cache()

segment_avg = (
    spark_df
    .groupBy('segment')
    .agg(
        sf.avg('score').alias('score')
    )
)

+----------+------+
|segment   |score |
+----------+------+
|Gold      |NaN   |
|Platinum  |NaN   |
|Silver    |NaN   |
+----------+------+

我尝试像这样替换spark_df 中的所有NaN

spark_df = spark_df.replace(float('nan'), None)

但它出错了:

ValueError:如果 to_replace 不是 dict,则 value 应该是 float、int、long、string、list 或 tuple。得到

spark_df.select('score').show(10,False)

+-----+
|score|
+-----+
|75.0 |
|34.0 |
|NaN  |
|NaN  |
|NaN  |
|76.0 |
|65.0 |
|43.0 |
|78.0 |
|88.0 |
+-----+

如何将这些 Nan 值替换为 null,以便在聚合时忽略它们?

【问题讨论】:

【参考方案1】:

使用isnan函数将列中的NaN替换为null

from pyspark.sql.functions import isnan, col, when, lit

spark_df = spark_df.withColumn('score', when(isnan(col('score')), lit(None)).otherwise(col('score')))

要替换整个数据框中的所有 NaN,请使用 .replace

spark_df = spark_df.replace(float('nan'), None)

【讨论】:

有没有办法针对数据框中的每个 NaN 而不是单个列?

以上是关于使用带有熊猫数据的 CreateDataFrame 时将 NaN 替换为 null的主要内容,如果未能解决你的问题,请参考以下文章

带有熊猫的剪影分数的正确数据格式

带有熊猫数据框的子图

我可以使用带有熊猫数据框的散点图绘制回归线并显示参数吗?

带有大熊猫数据框的python代码很慢

如何使用带有熊猫的随机森林来使用特征重要性?

带有前缀的Python熊猫数据框字符串转换为浮点数