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

如何在Pandas中实现随行数增长的滚动百分比排名?

Pandas DataFrame实现随行数增长的连续滚动排名

需求说明

需要在Pandas DataFrame中实现连续滚动排名,窗口大小随DataFrame行数逐行增长:

  • 第1行仅基于自身计算排名
  • 第2行基于前2行数据
  • ...
  • 最后一行基于整个序列数据

Pandas原生rolling()方法要求固定整数窗口大小,无法直接实现这种动态窗口的需求。

期望输出

IndexValueRank (descending)description
0616是第一行,因此排名为1
1323是6和3中的第二大值,排名为2
2424是6、3、4中的第二大值,排名为2
31001100是6、3、4、100中的最大值,排名为1
4151是6、3、4、100、1中的最小值,排名为5

问题分析

你尝试的代码:

df['len']=range(len(df))
df['rank']=df['value'].rolling(df['len']).rank(pct=True)

无法运行,因为rolling()方法不支持传入动态变化的窗口大小参数,仅接受固定整数。

解决方案

使用Pandas的expanding()方法,它会自动创建从第一行开始、逐行扩大的窗口,完美匹配需求。结合rank()方法设置降序和排名规则即可实现目标。

完整代码示例

import pandas as pd

# 构造示例DataFrame
data = {'Value': [6, 3, 4, 100, 1]}
df = pd.DataFrame(data)

# 计算逐行增长的降序排名,method='min'保证相同值取最小排名
df['Rank (descending)'] = df['Value'].expanding().rank(ascending=False, method='min')

# 添加描述列(可选,仅用于匹配示例输出)
df['description'] = [
    '6是第一行,因此排名为1',
    '3是6和3中的第二大值,排名为2',
    '4是6、3、4中的第二大值,排名为2',
    '100是6、3、4、100中的最大值,排名为1',
    '1是6、3、4、100、1中的最小值,排名为5'
]

print(df)

代码说明

  1. expanding():生成一个累积窗口,从第1行开始,每一行的窗口包含当前行及之前所有行的数据,正好实现“随行数增长的滚动窗口”。
  2. rank(ascending=False, method='min'):
    • ascending=False:设置降序排名(数值越大排名越靠前)
    • method='min':当存在相同数值时,取最小的排名,与示例中的排名规则一致。

运行代码后,输出结果将完全匹配你期望的表格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 02:17:05