python - 组内两列中的对的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。并为此列使用 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|
# +---+--------------+
推荐阅读
- asp.net-core - Asp.net 核心中间件根据请求 url 运行逻辑
- python - 我们可以仅通过整数编码获得有效的结果吗?
- c# - 在 C# 中将日期参数作为 NpgsqlParameter 传递
- node.js - 将配置/设置保存到关系数据库(postgresql)
- python - Python 脚本立即结束,代码没有问题
- javascript - 如何将nodejs本机模块注入puppppeteer页面
- python - 为什么没有为 Django 中的新表单创建主键?
- python - stripe.error.InvalidRequestError:请求 req_cB2yR3ogZdAH28:您不能多次使用 Stripe 令牌:tok_1FH9IqEoM5FutsBDcB1o0hYN
- ios - showAsset(.photoLibrary, withTag:button.tag) 中的导航栏在我使用 showAsset(.camera, withTag:button.tag) 拍照后总是消失
- python - 使用 Python 读取 json 数据 - 初学者问题