Проверьте, существует ли значение больше нуля во всех столбцах данных, используя pyspark. - PullRequest
0 голосов
/ 13 октября 2019
   data.select([count(when(isnan(c), c)).alias(c) for c in data.columns]).show()

Это код, который я пытался получить, подсчитав значения нан. Я хочу написать условие if-else, где, если определенный столбец содержит значения nan, я хочу напечатать имя столбца и количество значений nan.

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Если я вас правильно понимаю, вы хотите выполнить фильтрацию столбца , прежде чем передать его в список.

Например, у вас есть df, который выглядит следующим образом, гдестолбец c nan free ,

from pyspark.sql.functions import isnan, count, when
import numpy as np

df = spark.createDataFrame([(1.0, np.nan, 0.0), (np.nan, 2.0, 9.0),\
                          (np.nan, 3.0, 8.0), (np.nan, 4.0, 7.0)], ('a', 'b', 'c'))

df.show()
# +---+---+---+
# |  a|  b|  c|
# +---+---+---+
# |1.0|NaN|0.0|
# |NaN|2.0|9.0|
# |NaN|3.0|8.0|
# |NaN|4.0|7.0|
# +---+---+---+

Вам даны решения и материалы для производства

df.select([count(when((isnan(c)),c)).alias(c) for c in df.columns]).show()
# +---+---+---+
# |  a|  b|  c|
# +---+---+---+
# |  3|  1|  0|
# +---+---+---+

, но вы хотите

# +---+---+
# |  a|  b|
# +---+---+
# |  3|  1|
# +---+---+

Чтобы получить этот вывод, вы можете попробовать это

rows = df.collect()

#column filtering based on your nan condition
nan_columns = [''.join(key) for _ in rows  for (key,val) in _.asDict().items() if np.isnan(val)]

nan_columns = list(set(nan_columns)) #may sort if order is important
#nan_columns
#['a', 'b']

df.select([count(when((isnan(c)),c)).alias(c) for c in nan_columns]).show()
# +---+---+
# |  a|  b|
# +---+---+
# |  3|  1|
# +---+---+

0 голосов
/ 13 октября 2019

Вы можете просто преобразовать то же понимание в:

df.select([count(when(c > 0, c)).alias(c) for c in data.columns]).show()

, но это вызовет проблемы, когда у вас есть другие dtypes. Итак, давайте перейдем к:

from pyspark.sql.functions import col
# You can do the following two lines of code in one line, but want to make it more readable
schema = {col: col_type for col, col_type in df.dtypes}
numeric_columns = [
            col for col, col_type in schema.items()
            if col_type in "int double bitint".split()
        ]

df.select([count(when(col(c) > 0, c)).alias(c) for c in numeric_columns]).show()
...