如何在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
相关产品推荐
相关产品推荐

