组中两列中的对的 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'))

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

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|
# +---+--------------+

您可以删除包含空值的行,然后groupby + count

df.select('A').dropDuplicates().join(
    df.dropna(how='any').groupby('A').count(), on=['A'], how='left'
).show()
+---+-----+
|  A|count|
+---+-----+
|  1|    1|
|  3| null|
|  2|    1|
+---+-----+

如果不想执行联接,请创建另一列以指示列 B 或 C 中是否存在 null:

import pyspark.sql.functions as f
df.selectExpr('*', 
    'case when B is not null and C is not null then 1 else 0 end as D'
).groupby('A').agg(f.sum('D').alias('count')).show()
+---+-----+
|  A|count|
+---+-----+
|  1|    1|
|  3|    0|
|  2|    1|
+---+-----+

相关内容

  • 没有找到相关文章

最新更新