如何在Python/Spark中统计DataFrame中ID_links列表元素数>1的ID数量及占比?
问题描述
现有如下格式的DataFrame:
| ID | ID_links |
|---|---|
| 0 | [10] |
| 1 | [11, 12, 13] |
| 2 | [14, 15] |
| 3 | [16] |
| 4 | [17, 18, 19, 20] |
需要统计ID_links列中列表元素数量大于1的ID总数,以及这类ID占总ID的百分比。
伪代码逻辑:
- 遍历DataFrame的每一行
- 统计该行
ID_links列表的元素数量,若元素数大于1则计数器加1 - 将计数器数值除以DataFrame总行数得到占比
如何使用Python(Pandas)和Spark实现上述逻辑?
实现方案
一、Python(Pandas)实现
利用Pandas矢量化操作替代手动遍历,效率更高:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'ID': [0, 1, 2, 3, 4], 'ID_links': [[10], [11,12,13], [14,15], [16], [17,18,19,20]] }) # 统计符合条件的ID数量 qualified_count = (df['ID_links'].apply(len) > 1).sum() # 计算占比 total_count = len(df) percentage = (qualified_count / total_count) * 100 print(f"符合条件的ID总数:{qualified_count}") print(f"占总ID的百分比:{percentage:.2f}%")
说明:
apply(len)批量获取每个列表的长度,生成布尔序列标记是否符合条件sum()直接统计布尔序列中True的数量,即符合条件的ID数- 用总行数做除法得到占比,再转为百分比格式展示
二、Spark实现
利用Spark内置函数处理数组长度,适配大数据场景:
from pyspark.sql import SparkSession from pyspark.sql.functions import size, col # 初始化SparkSession spark = SparkSession.builder.appName("CountQualifiedIDs").getOrCreate() # 构造示例DataFrame data = [ (0, [10]), (1, [11,12,13]), (2, [14,15]), (3, [16]), (4, [17,18,19,20]) ] df = spark.createDataFrame(data, schema=["ID", "ID_links"]) # 计算符合条件的ID数量和总ID数 qualified_count = df.filter(size(col("ID_links")) > 1).count() total_count = df.count() # 计算占比 percentage = (qualified_count / total_count) * 100 print(f"符合条件的ID总数:{qualified_count}") print(f"占总ID的百分比:{percentage:.2f}%") # 关闭SparkSession spark.stop()
说明:
size()函数直接获取数组列的长度,无需自定义UDFfilter()筛选出长度大于1的行,count()得到符合条件的ID数量- 总ID数通过
df.count()获取,占比计算逻辑与Pandas一致
内容的提问来源于stack exchange,提问作者user20132029
相关产品推荐
相关产品推荐

