PySpark:从多列提取所有组合并计算频率占比的实现方法
PySpark组合占比统计实现
整体逻辑是先把原表所有需要统计的列的单元格值全部提取为单列的单行数据,再做频次统计和占比计算即可,完整代码如下:
from pyspark.sql import SparkSession import pyspark.sql.functions as F # 初始化Spark,构造示例原始数据,你可以替换为自己的数据源 spark = SparkSession.builder.appName("calc_combination_ratio").getOrCreate() raw_data = [ ("A, B", "D, G", "A, G"), ("C, F", "C, D", "A, G"), ("C, F", "C, D", "A, G") ] df = spark.createDataFrame(raw_data, schema=["Col1", "Col2", "Col3"]) # 1. 把所有要统计的列合并为数组后炸开,得到所有组合值的单列数据 exploded_df = df.select(F.explode(F.array("Col1", "Col2", "Col3")).alias("Combination")) # 2. 统计每个组合的出现次数 count_df = exploded_df.groupBy("Combination").count() # 3. 计算所有组合总数量 total = exploded_df.count() # 4. 计算占比并拼接说明字符串 result_df = count_df.withColumn( "Ratio", F.concat( F.round(F.col("count") / total, 3).cast("string"), F.lit(" ("), F.col("count").cast("string"), F.lit("/"), F.lit(str(total)), F.lit(")") ) ).drop("count") # 输出结果 result_df.show(truncate=False)
运行上述代码后输出的结果和你给出的预期完全匹配。如果后续需要统计的列有增减,只需要修改F.array()里传入的列名列表即可,其他逻辑不需要调整。
内容的提问来源于stack exchange,提问作者ShawnK
相关产品推荐
相关产品推荐

