У меня есть такие данные
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'))
Вы можете удалить строки, содержащие нулевые значения, а затем 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:
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|
+---+-----+
Лично я бы использовал вспомогательный столбец, говорящий о том, является ли 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|
# +---+--------------+
Привет, Псидом, извини, что я забыл обновить свой вопрос. Пожалуйста, взгляните на отредактированный вопрос. Я действительно не хочу использовать объединение, чтобы сохранить все категории в «А», но с этой процедурой мне нужно выполнить левое соединение, я думаю. Спасибо.