在PySpark中,与Panda的value_counts()相当的是什么?

49

我正在使用以下Python/Pandas命令:

df.groupby('Column_Name').agg(lambda x: x.value_counts().max()

我如何在PySpark中获取一个DataFrameGroupBy对象的所有列的值计数?


我要求的任务非常简单。我想在一个分组数据框中获取所有列的值计数(最高不同计数)。这在Pandas中很容易通过value_counts()方法实现。 - TSAR
这是我的DF:>>> schemaTrans.show() +----+----+------+-----+----+----+ |COL1|COL2| COL3| COL4|COL5| ID| +----+----+------+-----+----+----+ | 123| 456|ABC123| XYZ| 525|ID01| | 123| 456|ABC123| XYZ| 634|ID01| | 123| 456|ABC123| XYZ| 802|ID01| | 456| 123| BC01|K_L_M| 213|ID01| | 456| 123| BC01|K_L_M| 401|ID01| | 456| 123| BC01|P_Q_M| 213|ID01| | 123| 456|XYZ012| ABC| 117|ID02| | 123| 456|XYZ012| ABE| 117|ID02| | 456| 123| QPR12|S_T_U| 204|ID02| | 456| 123| QPR12|S_T_X| 415|ID02| +----+----+------+-----+----+----+ - TSAR
从pyspark.sql.functions导入计数 exprs = {x:“count” for x in schemaTrans.columns} schemaTrans.groupBy(“ID”).agg(exprs).show(5) +----+---------+-----------+-----------+-----------+-----------+-----------+ ID | count(ID)| count(COL4)| count(COL2)| count(COL3)| count(COL1)| count(COL5)| +----+---------+-----------+-----------+-----------+-----------+-----------+ | ID01 | 6 | 6 | 6 | 6 | 6 | 6 | | ID02 | 4 | 4 | 4 | 4 | 4 | 4 | +----+---------+-----------+-----------+-----------+-----------+--------- - TSAR
exprs = [countDistinct(x) for x in schemaTrans.columns] schemaTrans.groupBy("ID").agg(*exprs).show(5) | ID|(DISTINCT COL1)|(DISTINCT COL2)|(DISTINCT COL3)|(DISTINCT COL4)|(DISTINCT COL5)|(DISTINCT ID)| +----+---------------+---------------+---------------+---------------+---------------+---------|ID01| 2 | 2 | 2 | 3 | 5 | 1 | |ID02| 2 | 2 | 2 | 4 | 3 | 1 | +----+---------------+---------------+---------------+---------------+---------------+--------- - TSAR
但我想要的是:+----+----------+-----------+-----------+-----------+-----------+--------+| ID|(VL COL1) | (VL COL2) | (VL COL3) | (VL COL4) | (VL COL5) | (VL ID)| +----+----------+-----------+-----------+-----------+-----------+--------+ |ID01| 3 | 3 | 3 | 3 | 2 | 1 | |ID02| 2 | 2 | 2 | 2 | 2 | 1 | +----+----------+-----------+-----------+-----------+-----------+--------+ - TSAR
2
请不要将这些内容添加为评论。[编辑]您的问题并将其放在那里。请还阅读如何格式化我的代码块。另外,请查看如何创建良好的可重现的Apache Spark DataFrame示例 - pault
5个回答

42

差不多一样:

spark_df.groupBy('column_name').count().orderBy('count')

groupBy 中,您可以使用逗号分隔多个列。

例如 groupBy('column_1', 'column_2')


嗨,谭津,感谢您的回复!我没有得到相同的结果。我一直在做以下操作:(操作1):从pyspark.sql.functions中导入计数exprs = {x:“count” for x in df.columns} df.groupBy(“ID”)。agg(exprs).show(5),这个可以工作,但我得到了每个组的所有记录计数。那不是我想要的。(操作2)从pyspark.sql.functions中导入countDistinctexprs = [countDistinct(x)for x in df.columns] df.groupBy(“ID”)。agg(* exprs).show(5)这个出错了!!它的错误如下:ERROR client.TransportResponseHandler: - TSAR
3
对于初学者来说,在该行末尾添加缺失的 .show() 以查看结果可能会令人感到困惑。请注意,这不会改变原意。 - rer
4
为了与 Pandas 中的行为相匹配,您需要按降序返回计数: spark_df.groupBy('column_name').count().orderBy(col('count').desc()).show() - Bernard

14

当您想控制顺序时,请尝试以下方法:

data.groupBy('col_name').count().orderBy('count', ascending=False).show()

3

试试这个:

spark_df.groupBy('column_name').count().show()

0
from pyspark.sql import SparkSession
from pyspark.sql.functions import count, desc
spark = SparkSession.builder.appName('whatever_name').getOrCreate()
spark_sc = spark.read.option('header', True).csv(your_file)    
value_counts=spark_sc.select('Column_Name').groupBy('Column_Name').agg(count('Column_Name').alias('counts')).orderBy(desc('counts'))
value_counts.show()

但是在单机上,Spark 比 Pandas 的 value_counts() 慢得多。


0

df.groupBy('column_name').count().orderBy('count').show()


2
请阅读“[答案]”。如果您能提供为什么这是首选解决方案以及解释其工作原理的说明,那将更有帮助。我们想要教育,而不仅仅提供代码。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接