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

如何在Python中计算DataFrame列仅考虑前置行的百分位数?

计算DataFrame每行基于之前数据的百分位数

你需要计算每行数值在从第一行到当前行所有数据中的百分位数,核心思路是利用pandas的**扩展窗口(expanding window)**结合自定义计算逻辑,以下是两种可行实现:

方法一:纯Pandas实现(无需额外库)

直接通过扩展窗口和自定义函数完成统计:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({'col_1': [5, 4, 10, 1, 7]})

def rolling_percentile(window):
    current_val = window.iloc[-1]
    # 统计窗口中小于等于当前值的元素数量
    count_le = (window <= current_val).sum()
    # 计算百分位数
    return (count_le / len(window)) * 100

# 应用扩展窗口计算
df['percentile'] = df['col_1'].expanding().apply(rolling_percentile)

运行后得到的结果与你的示例完全一致:

col_1  percentile
0      5       100.0
1      4        50.0
2     10       100.0
3      1        25.0
4      7        80.0

方法二:使用Scipy简化计算(推荐)

如果已安装scipy库,可以用内置的percentileofscore函数,其中kind='weak'参数正好匹配你的需求(统计小于等于当前值的比例):

import pandas as pd
from scipy.stats import percentileofscore

df = pd.DataFrame({'col_1': [5, 4, 10, 1, 7]})

def rolling_percentile(window):
    return percentileofscore(window, window.iloc[-1], kind='weak')

df['percentile'] = df['col_1'].expanding().apply(rolling_percentile)

关键逻辑说明

  • expanding():生成扩展窗口,每个窗口包含从第一行到当前行的全部数据,完美满足"仅考虑该行及之前行数据"的要求。
  • 百分位数计算逻辑:统计窗口中小于等于当前行数值的元素占比,乘以100得到最终百分位数,与你示例中的计算规则完全对齐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:26:15