【问题标题】:Is there a way to do rolling rank in Pandas?有没有办法在 Pandas 中进行滚动排名?
【发布时间】:2020-12-27 05:35:13
【问题描述】:

我试图在 N 天的滚动期内对一列中的一些值进行排名,而不是对整个集合进行排名。我在这里看到了几种使用 rolling_apply 的方法,但我读到这不再在 python 中了。例如,在下表中;

A
01-01-2013 100
02-01-2013 85
03-01-2013 110
04-01-2013 60
05-01-2013 20
06-01-2013 40

对于上面的A列,N = 3如何才能得到如下排名;

A Ranked_A
01-01-2013 100 NaN
02-01-2013 85 Nan
03-01-2013 110 1
04-01-2013 60 3
05-01-2013 20 3
06-01-2013 40 2

【问题讨论】:

    标签: python pandas dataframe ranking rank


    【解决方案1】:

    是的,我们有一些解决方法,仍然使用rolling,但需要apply

    df.A.rolling(3).apply(lambda x: pd.Series(x).rank(ascending=False)[-1])
    01-01-2013    NaN
    02-01-2013    NaN
    03-01-2013    1.0
    04-01-2013    3.0
    05-01-2013    3.0
    06-01-2013    2.0
    Name: A, dtype: float64
     
    

    【讨论】:

    • 非常感谢。 [-1] 代表什么?在我的数据中,如果我设置一个较大的滚动窗口(例如 30 或 KeyError: -1 当窗口为 6 或更少时),我会得到整个系列的结果 NaN。
    • @evacoder 选择每个 rolling 的最后一行,因为 rolling 是返回一个数组
    • 非常感谢。经过一番努力,在您的帮助下,我终于设法找到了适用于我的数据集的解决方案。在我应用了滚动排名公式后,我还意识到我的桌子上有一个错误,这弄乱了计算。 rank_pos = lambda x: pd.Series(x).rank(ascending=False).iloc[-1] js_sales_raw['sales_rank'] = js_sales_raw['rate_of_sale_i'].rolling(window = 30,center=False).apply (rank_pos)
    • 如果性能是一个问题,您可能需要查看此线程:github.com/pandas-dev/pandas/issues/9481,特别是github.com/contribu/rollingrank
    猜你喜欢
    • 1970-01-01
    • 2019-09-08
    • 2021-03-07
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多