0

Как посчитать количество каждой уникальной значения в DataFrame PySpark?

37

У меня есть столбец с инициалами штатов в виде строк. Моя задача заключается в том, чтобы подсчитать количество вхождений каждого штата в этом списке.

Например: (("TX":3),("NJ":2)) должен быть выводом, когда инициал "TX" встречается два раза, а "NJ" — дважды.

Я довольно новенький в pyspark, и эта задача вызывает у меня затруднения. Буду очень благодарен за помощь!

1 ответ(ов)

0

Вопрос: Как мне подсчитать наиболее часто встречающиеся значения в столбце DataFrame PySpark и показать результаты в определенном порядке?

Ответ:

Вы можете использовать следующий код на Python с библиотеками pandas и pyspark. Функция value_counts принимает DataFrame PySpark и наименование столбца, в котором вы хотите подсчитать значения. Также вы можете задать порядок сортировки и количество отображаемых значений.

import pandas as pd
import pyspark.sql.functions as F

def value_counts(spark_df, colm, order=1, n=10):
    """
    Подсчитывает топ n значений в заданном столбце и выводит в заданном порядке.

    Параметры
    ----------
    spark_df : pyspark.sql.dataframe.DataFrame
        Данные
    colm : string
        Название столбца, в котором нужно подсчитать значения
    order : int, default=1
        1: сортировать по убыванию счетчиков значений, нулевые значения на верх
        2: сортировать по возрастанию значений
        3: сортировать по убыванию значений
        4: выполнять 2 и 3 (объединить топ n и боттом n после сортировки столбца по возрастанию значений)
    n : int, default=10
        Количество значений, которые нужно отобразить

    Возвращает
    ----------
    Подсчеты значений в DataFrame pandas
    """

    if order == 1:
        return pd.DataFrame(spark_df.select(colm).groupBy(colm).count().orderBy(F.desc_nulls_first("count")).head(n), columns=["value", "count"]) 
    if order == 2:
        return pd.DataFrame(spark_df.select(colm).groupBy(colm).count().orderBy(F.asc(colm)).head(n), columns=["value", "count"]) 
    if order == 3:
        return pd.DataFrame(spark_df.select(colm).groupBy(colm).count().orderBy(F.desc(colm)).head(n), columns=["value", "count"]) 
    if order == 4:
        return pd.concat([
            pd.DataFrame(spark_df.select(colm).groupBy(colm).count().orderBy(F.asc(colm)).head(n), columns=["value", "count"]),
            pd.DataFrame(spark_df.select(colm).groupBy(colm).count().orderBy(F.desc(colm)).head(n), columns=["value", "count"])
        ])

Обратите внимание, что функция возвращает результаты в виде DataFrame pandas, что позволяет удобно работать с данными в дальнейшем. Кроме того, вы можете настраивать порядок сортировки по вашим потребностям.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь