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'))
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
934
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете удалить строки, содержащие нулевые значения, а затем 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|
+---+-----+

Привет, Псидом, извини, что я забыл обновить свой вопрос. Пожалуйста, взгляните на отредактированный вопрос. Я действительно не хочу использовать объединение, чтобы сохранить все категории в «А», но с этой процедурой мне нужно выполнить левое соединение, я думаю. Спасибо.

Eleanor 10.04.2019 21:06
Ответ принят как подходящий

Лично я бы использовал вспомогательный столбец, говорящий о том, является ли 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|
# +---+--------------+

Другие вопросы по теме