【问题标题】:How to calculate the counts of each distinct value in a pyspark dataframe?如何计算 pyspark 数据框中每个不同值的计数?
【发布时间】:2017-07-16 00:37:52
【问题描述】:

我有一列填充了一堆州的首字母作为字符串。我的目标是如何计算此类列表中每个州的数量。

例如:(("TX":3),("NJ":2)) 应该是"TX""NJ" 出现两次时的输出。

我对 pyspark 还很陌生,所以我被这个问题难住了。任何帮助将不胜感激。

【问题讨论】:

  • 我对 pyspark 一无所知,但如果你的字符串集合是可迭代的,你可以将它传递给 collections.Counter,它的存在是为了明确计算不同的值。

标签: python dataframe pyspark


【解决方案1】:

我认为您正在寻找使用 groupBycount 的 DataFrame 习惯用法。

例如,给定以下数据框,每行一个状态:

df = sqlContext.createDataFrame([('TX',), ('NJ',), ('TX',), ('CA',), ('NJ',)], ('state',))
df.show()
+-----+
|state|
+-----+
|   TX|
|   NJ|
|   TX|
|   CA|
|   NJ|
+-----+

以下产量:

df.groupBy('state').count().show()
+-----+-----+
|state|count|
+-----+-----+
|   TX|    2|
|   NJ|    2|
|   CA|    1|
+-----+-----+

【讨论】:

  • 我怎样才能得到一个排序列表作为输出?
  • 添加.sort('state') 喜欢df.groupBy('state').count().sort('state').show()
  • 只是为了添加到@Paul 的评论中,链接到 orderBy/sort 的 api 文档:spark.apache.org/docs/latest/api/python/…(它还演示了如何指定升序/降序)
【解决方案2】:

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

def value_counts(spark_df, colm, order=1, n=10):
    """
    Count top n values in the given column and show in the given order

    Parameters
    ----------
    spark_df : pyspark.sql.dataframe.DataFrame
        Data
    colm : string
        Name of the column to count values in
    order : int, default=1
        1: sort the column descending by value counts and keep nulls at top
        2: sort the column ascending by values
        3: sort the column descending by values
        4: do 2 and 3 (combine top n and bottom n after sorting the column by values ascending) 
    n : int, default=10
        Number of top values to display

    Returns
    ----------
    Value counts in pandas dataframe
    """

    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"])])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2017-03-24
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2021-08-28
    相关资源
    最近更新 更多