You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark不使用groupBy/agg通过withColumn统计列值出现次数方案

解决方案

完全可以通过withColumn()配合PySpark窗口函数实现,不需要使用groupBy()+agg()压缩原表行数,可完整保留原有DataFrame的所有行和结构。

实现逻辑

窗口函数支持按指定列分区后做聚合计算,且聚合结果会回填到当前分区的每一行,刚好匹配你要的同值行统计结果一致的需求。

完整代码示例

# 导入依赖
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql.window import Window

# 初始化SparkSession(已有可省略)
spark = SparkSession.builder.appName("value_count").getOrCreate()

# 构造测试数据(和你示例的出现次数对应:10出现3次、20出现4次、30出现9次)
test_data = [(10,), (10,), (10,), (20,), (20,), (20,), (20,), *[(30,) for _ in range(9)]]
df = spark.createDataFrame(test_data, schema=["col1"])

# 定义窗口规则:按统计列col1分区
count_window = Window.partitionBy("col1")

# 新增count_col列,统计每个col1取值的总出现次数
result_df = df.withColumn("count_col", F.count("*").over(count_window))

# 输出验证结果
result_df.show()

效果说明

运行后所有行完整保留,col1取值相同的行count_col值完全一致,和你要求的效果完全匹配:

  • col1 = 10的所有行count_col = 3
  • col1 = 20的所有行count_col = 4
  • col1 = 30的所有行count_col = 9

如果需要统计多列组合的出现次数,只需修改partitionBy的入参即可,例如Window.partitionBy("col1", "col2")就是统计col1+col2组合的总出现次数。

内容的提问来源于stack exchange,提问作者abc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:39:01