pyspark: удалить столбцы с одинаковыми значениями во всех строках - PullRequest
0 голосов
/ 17 декабря 2018

Смежный вопрос: Как удалить столбцы с одинаковыми значениями во всех строках с помощью панд или искрового фрейма данных?

Итак, у меня есть фрейм данных pyspark, и я хочу удалить столбцы, гдевсе значения одинаковы во всех строках, при этом другие столбцы остаются неизменными.

Однако ответы на поставленный выше вопрос даны только для панд.Есть ли решение для pyspark dataframe?

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Вы можете использовать функцию approx_count_distinct ( ссылка ) для подсчета количества различных элементов в столбце.Если есть только один отдельный элемент, удалите соответствующий столбец.

Создание кадра данных

from pyspark.sql.functions import approx_count_distinct
myValues = [(1,2,2,0),(2,2,2,0),(3,2,2,0),(4,2,2,0),(3,1,2,0)]
df = sqlContext.createDataFrame(myValues,['value1','value2','value3','value4'])
df.show()
+------+------+------+------+
|value1|value2|value3|value4|
+------+------+------+------+
|     1|     2|     2|     0|
|     2|     2|     2|     0|
|     3|     2|     2|     0|
|     4|     2|     2|     0|
|     3|     1|     2|     0|
+------+------+------+------+

Отслеживание числа отдельных элементов и преобразование его всловарь.

count_distinct_df=df.select([approx_count_distinct(x).alias("{0}".format(x)) for x in df.columns])
count_distinct_df.show()
+------+------+------+------+
|value1|value2|value3|value4|
+------+------+------+------+
|     4|     2|     1|     1|
+------+------+------+------+
dict_of_columns = count_distinct_df.toPandas().to_dict(orient='list')
dict_of_columns
    {'value1': [4], 'value2': [2], 'value3': [1], 'value4': [1]}

#Storing those keys in the list which have just 1 distinct key.
distinct_columns=[k for k,v in dict_of_columns.items() if v == [1]]
distinct_columns
    ['value3', 'value4']

Удалить столбцы с различными значениями

df=df.drop(*distinct_columns)
df.show()
+------+------+
|value1|value2|
+------+------+
|     1|     2|
|     2|     2|
|     3|     2|
|     4|     2|
|     3|     1|
+------+------+
0 голосов
/ 17 декабря 2018

Вы можете применить функцию агрегирования countDistinct() к каждому столбцу, чтобы получить количество различных значений для каждого столбца.Столбец с числом = 1 означает, что он имеет только 1 значение во всех строках.

# apply countDistinct on each column
col_counts = df.agg(*(countDistinct(col(c)).alias(c) for c in df.columns)).collect()[0].asDict()

# select the cols with count=1 in an array
cols_to_drop = [col for col in df.columns if col_counts[col] == 1 ]

# drop the selected column
df.drop(*cols_to_drop).show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...