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

计算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()函数结合归一化实现:

  1. 对目标列计算排名,通过method参数指定重复值的处理规则(如"average"取平均排名、"min"取最小排名)
  2. 将排名结果除以列的总数据量,得到分位数位置

示例代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:43:20