如何统计PySpark DataFrame中某列各分类变量的出现频次?
统计PySpark DataFrame分类列的出现频次
嘿,这个需求在PySpark里其实很好实现,我给你两种常用的方法,都很容易上手:
首先先还原你的DataFrame(方便后续测试):
from pyspark.sql import SparkSession # 初始化SparkSession spark = SparkSession.builder.appName("category_count").getOrCreate() # 构造数据 data = [("alpha", 1), ("beta", 2), ("gamma", 1), ("alpha", 2)] df = spark.createDataFrame(data, ["x", "y"]) # 查看原始数据 df.show()
运行后会得到你给出的结果:
+-----+---+ | x | y | +-----+---+ |alpha| 1 | |beta | 2 | |gamma| 1 | |alpha| 2 | +-----+---+
方法一:经典分组聚合(兼容所有Spark版本)
这是最通用的方式,用groupBy()对x列分组,再配合count()统计每组的行数:
from pyspark.sql.functions import count # 分组并统计频次,给结果列起个直观的名字 count_result = df.groupBy("x").agg(count("*").alias("occurrence_count")) # 查看统计结果 count_result.show()
输出结果:
+-----+----------------+ | x|occurrence_count| +-----+----------------+ |alpha| 2| | beta| 1| |gamma| 1| +-----+----------------+
这里count("*")可以替换成count("y")或者count(lit(1)),效果完全一致;alias()是为了让统计列的名字更易懂,你也可以改成自己喜欢的名称。
方法二:简洁的value_counts()(Spark 3.0+适用)
如果你用的是Spark 3.0及以上版本,还可以用更简洁的API直接统计:
# 选择x列后调用value_counts,一步到位 count_result = df.select("x").value_counts() # 查看结果 count_result.show()
输出结果:
+-----+-----+ | x|count| +-----+-----+ |alpha| 2| | beta| 1| |gamma| 1| +-----+-----+
默认的统计列名是count,如果需要改名,直接用withColumnRenamed("count", "occurrence_count")即可。
可选:对结果排序
如果需要按频次高低排序,只需要在结果后加上orderBy():
# 方法一的排序示例(按频次降序) count_result.orderBy("occurrence_count", ascending=False).show() # 方法二的排序示例 count_result.orderBy("count", ascending=False).show()
内容的提问来源于stack exchange,提问作者Jas
相关产品推荐
相关产品推荐

