【问题标题】:Counting number of nulls in pyspark dataframe by row逐行计算pyspark数据帧中的空值数
【发布时间】:2018-10-17 22:56:52
【问题描述】:

所以我想逐行计算数据帧中空值的数量。

请注意,有 50 多列,我知道我可以使用 case/when 语句来执行此操作,但我更喜欢更简洁的解决方案。

例如,一个子集:

columns = ['id', 'item1', 'item2', 'item3']
vals = [(1, 2, 0, None),(2, None, 1, None),(3,None,9, 1)]
df=spark.createDataFrame(vals,columns)
df.show()

+---+-----+-----+-----+
| id|item1|item2|item3|
+---+-----+-----+-----+
|  1|    2|  'A'| null|
|  2| null|    1| null|
|  3| null|    9|  'C'|
+---+-----+-----+-----+

运行代码后,想要的输出是:

+---+-----+-----+-----+--------+
| id|item1|item2|item3|numNulls|
+---+-----+-----+-----+--------+
|  1|    2|  'A'| null|       1|
|  2| null|    1| null|       2|
|  3| null|    9|  'C'|       1|
+---+-----+-----+-----+--------+

编辑:并非所有非空值都是整数。

【问题讨论】:

    标签: dataframe pyspark apache-spark-sql pyspark-sql


    【解决方案1】:

    null 转换为1 和其他转换为0 然后sum 所有列:

    df.withColumn('numNulls', sum(df[col].isNull().cast('int') for col in df.columns)).show()
    +---+-----+-----+-----+--------+
    | id|item1|item2|item3|numNulls|
    +---+-----+-----+-----+--------+
    |  1|    2|    0| null|       1|
    |  2| null|    1| null|       2|
    |  3| null|    9|    1|       1|
    +---+-----+-----+-----+--------+
    

    【讨论】:

    • 这些值实际上并不总是整数,我已经更新了问题以反映这一点。
    • 答案不假定整数。它通常检查 null,如果为 null,则将值替换为 1,否则为 0。然后求和。
    • 完美运行。谢谢。
    • 我在同一个例子中得到错误TypeError: 'Column' object is not callable
    • 所以我使用 pyspark.sql.functions.sum 而不是 Python sum 这给我带来了问题。更多关于区别here
    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 2022-09-22
    • 2023-03-17
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    相关资源
    最近更新 更多