计算Polars列中每行数据的分位数?Polars是否支持经验CDF?
Polars计算每行数据所属分位数(经验CDF)的实现方法
Polars完全支持计算经验CDF(即每行数据对应的分位数位置),不需要依赖外部工具,有两种常用的内置实现方式:
方法1:使用ecdf()内置函数(推荐)
Polars的表达式API提供了ecdf()方法,可直接返回列中每个值对应的经验累积分布函数值,也就是该值在数据集中的分位数位置。这个方法处理重复值时会自动采用合理的累积逻辑,使用起来最简洁。
示例代码:
import polars as pl # 构造测试数据 df = pl.DataFrame({"value": [1, 2, 2, 3, 4, 5]}) # 添加经验分位数列 df = df.with_columns( empirical_quantile=pl.col("value").ecdf() ) print(df)
输出结果:
shape: (6, 2) ┌───────┬──────────────────┐ │ value ┆ empirical_quantile │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═══════╪══════════════════╡ │ 1 ┆ 0.166667 │ │ 2 ┆ 0.5 │ │ 2 ┆ 0.5 │ │ 3 ┆ 0.666667 │ │ 4 ┆ 0.833333 │ │ 5 ┆ 1.0 │ └───────┴──────────────────┘
方法2:基于rank()函数手动计算
如果需要更灵活地控制排名逻辑(比如处理重复值的方式),可以用rank()函数结合归一化实现:
- 对目标列计算排名,通过
method参数指定重复值的处理规则(如"average"取平均排名、"min"取最小排名) - 将排名结果除以列的总数据量,得到分位数位置
示例代码:
import polars as pl df = pl.DataFrame({"value": [1, 2, 2, 3, 4, 5]}) df = df.with_columns( # 使用average排名处理重复值,归一化后得到分位数 empirical_quantile=pl.col("value").rank(method="average") / pl.col("value").count() ) print(df)
输出结果和ecdf()方法一致,你可以根据需求选择不同的rank方法调整计算逻辑。
内容的提问来源于stack exchange,提问作者GBPU
相关产品推荐
相关产品推荐

