首页 > 解决方案 > 组内两列中的对的pyspark计数不是空值

问题描述

我有一些这样的数据

A    B    C
1   Null  3
1   2     4
2   Null  6
2   2    Null
2   1    2
3   Null 4

我想按 A 分组,然后计算不包含 Null 值的行数。所以,结果应该是

A    count  
1      1
2      1
3      0

我不认为这会奏效......,是吗?

df.groupby('A').agg(count('B','C'))

标签: pythongroup-bycountpysparknull

解决方案


就个人而言,我会使用一个辅助列来说明 B 或 C 是​​否为 Null。此解决方案中的负结果并返回 1 或 0。并为此列使用 sum。

from pyspark.sql.functions import sum, when
# ...
df.withColumn("isNotNull", when(df.B.isNull() | df.C.isNull(), 0).otherwise(1))\
    .groupBy("A").agg(sum("isNotNull"))

演示:

df.show()
# +---+----+----+                                                                 
# | _1|  _2|  _3|
# +---+----+----+
# |  1|null|   3|
# |  1|   2|   4|
# |  2|null|   6|
# |  2|   2|null|
# |  2|   1|   2|
# |  3|null|   4|
# +---+----+----+

df.withColumn("isNotNull", when(df._2.isNull() | df._3.isNull(), 0).otherwise(1)).show()
# +---+----+----+---------+
# | _1|  _2|  _3|isNotNull|
# +---+----+----+---------+
# |  1|null|   3|        0|
# |  1|   2|   4|        1|
# |  2|null|   6|        0|
# |  2|   2|null|        0|
# |  2|   1|   2|        1|
# |  3|null|   4|        0|
# +---+----+----+---------+

df.withColumn("isNotNull", when(df._2.isNull() | df._3.isNull(), 0).otherwise(1))\
  .groupBy("_1").agg(sum("isNotNull")).show()
# +---+--------------+
# | _1|sum(isNotNull)|
# +---+--------------+
# |  1|             1|
# |  3|             0|
# |  2|             1|
# +---+--------------+

推荐阅读