PySpark DataFrame年龄分桶统计:按10年区间分组计算数量
如何用PySpark对年龄按10年区间分桶并统计数量?
嗨,我来帮你搞定这个需求!要实现按10年区间(比如11-20、21-30)对年龄分桶并统计每个区间的条目数,我们可以通过计算区间标签+分组聚合的方式轻松实现,下面是具体步骤和完整代码:
核心思路
- 计算区间边界:对每个年龄值,先算出它所属区间的起始和结束值(比如21对应21-30,35对应31-40)
- 生成区间标签:把起始和结束值拼接成
"21-30"这样的字符串,作为分桶的标识 - 分组统计:按区间标签分组,统计每个组的条目数量
完整代码示例
from pyspark.sql import SparkSession from pyspark.sql.functions import concat_ws, floor, col, count # 初始化SparkSession(如果你的环境已经有了可以跳过这步) spark = SparkSession.builder.appName("AgeBucketStats").getOrCreate() # 构建示例输入DataFrame sample_data = [(21,), (23,), (35,), (39,)] age_df = spark.createDataFrame(sample_data, ["age"]) # 第一步:生成年龄区间标签 bucketed_age_df = age_df.withColumn( "age_bucket", concat_ws( "-", # 计算区间起始值:比如21→21,35→31 (floor((col("age") - 1) / 10) * 10 + 1).cast("string"), # 计算区间结束值:比如21→30,35→40 (floor((col("age") - 1) / 10) * 10 + 10).cast("string") ) ) # 第二步:按区间分组统计数量 result_df = bucketed_age_df.groupBy("age_bucket").agg(count("*").alias("count")) # 查看结果 result_df.show()
运行这段代码后,你会得到和预期一致的输出:
+----------+-----+ |age_bucket|count| +----------+-----+ | 21-30| 2| | 31-40| 2| +----------+-----+
关键代码解释
- 区间计算逻辑:
floor((col("age") - 1) / 10) * 10 +1是核心,它能把所有年龄精准映射到对应的区间起始值:- 比如21:(21-1)/10=2 → floor后是2 → 2*10+1=21
- 比如10:(10-1)/10=0.9 → floor后是0 → 0*10+1=1(所以10会被分到1-10区间)
- concat_ws:用来把起始和结束值用连字符拼接成友好的区间字符串
- groupBy + agg(count):按区间分组后,统计每个组的行数,并重命名为
count
扩展:处理特殊情况(比如0岁)
如果你的数据里有0岁的情况,想要单独分桶,可以加个when条件处理:
from pyspark.sql.functions import when, lit bucketed_age_df = age_df.withColumn( "age_bucket", when( col("age") == 0, lit("0") ).otherwise( concat_ws( "-", (floor((col("age") - 1) / 10) * 10 + 1).cast("string"), (floor((col("age") - 1) / 10) * 10 + 10).cast("string") ) ) )
这样0岁就会被单独归类到"0"这个桶里,其他年龄正常分区间~
内容的提问来源于stack exchange,提问作者Nightwing
相关产品推荐
相关产品推荐

