【问题标题】:Python Pandas: Calculate cumulative sum using rolling lookback windowPython Pandas:使用滚动回溯窗口计算累积和
【发布时间】:2017-11-09 22:36:45
【问题描述】:

我正在计算(下表)中 Total Wins (2 Days) 列的值 - 另请参阅下面的逗号分隔值。

Total Wins (2 Days) 是运动员在当天(例如第 5 天)或前一天(例如第 4 天)赢得的比赛次数的累积计数 - 因此,它是计算 2 天回溯窗口内的获胜次数。 (我可能想将回溯窗口更改为任意数字)。

例如,在第 7 天:简计数为 1,因为她在第 7 天赢了,但在第 6 天输了;比尔计数为 1,因为他在第 7 天输了,但在第 6 天赢了。史蒂夫在任何一天都没有赢。

在第 6 天,比尔计数为 1,因为他在第 5 天赢了,但在第 5 天输了。史蒂夫计数为 1,因为他在第 6 天输了,但在第 5 天赢了。简没有赢。

在 Python 中计算“总获胜次数(2 天)”的最佳方法是什么?

后续问题

另外,作为后续问题:关于“.rolling(2)”的参数(即本例中的 2),我如何将参数设置为从其他列派生的值在桌子上?

我想要做的是将 Race Day 更改为 datetime 对象(请参阅下面的更新表)并计算“总获胜次数(X 天)”作为上周、一个月、一年等赢得的比赛次数。 (我使用的数据库比上面的例子大)。

我更愿意将年份定义为日历年(即在 2014 年 1 月 1 日和 2015 年 1 月 1 日之间赢得的比赛),而不是简单的 265 天。

Race Day,Athlete,Position,Total Wins,Total Wins (2 Days)
1,Steve,1,1,1
1,Jane,2,0,0
1,Bill,3,0,0
2,Bill,1,1,1
2,Steve,2,1,1
2,Jane,3,0,0
3,Jane,1,1,1
3,Bill,2,1,1
3,Steve,3,1,0
4,Steve,1,2,1
4,Jane,2,1,1
4,Bill,3,1,0
5,Steve,1,3,2
5,Jane,2,1,0
5,Bill,3,1,0
6,Bill,1,2,1
6,Steve,2,3,1
6,Jane,3,1,0
7,Jane,1,2,1
7,Bill,2,2,1
7,Steve,3,3,0

Race Day,Athlete,Position,Total Wins,Total Wins (2 Months)
2000-01-01,Steve,1,1,?
2000-01-01,Jane,2,0,?
2000-01-01,Bill,3,0,?
2000-01-02,Bill,1,1,?
2000-01-02,Steve,2,1,?
2000-01-02,Jane,3,0,?
2000-01-03,Jane,1,1,?
2000-01-03,Bill,2,1,?
2000-01-03,Steve,3,1,?
2000-01-04,Steve,1,2,?
2000-01-04,Jane,2,1,?
2000-01-04,Bill,3,1,?
2000-01-05,Steve,1,3,?
2000-01-05,Jane,2,1,?
2000-01-05,Bill,3,1,?
2000-01-06,Bill,1,2,?
2000-01-06,Steve,2,3,?
2000-01-06,Jane,3,1,?
2000-01-07,Jane,1,2,?
2000-01-07,Bill,2,2,?
2000-01-07,Steve,3,3,?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    创建一个赢得每行的位置 1 的列,然后应用滚动总和

    df['Won'] = (df['Position'] == 1).astype(int)
    
    df['Total Wins (2 Days)'] = df.groupby('Athlete')['Won'].apply(lambda x: x.rolling(2).sum()).combine_first(df['Won'])
    
        Race Day    Athlete Position    Total Wins  Total Wins (2 Days) Won
    0   1           Steve   1           1           1.0                 1
    1   1           Jane    2           0           0.0                 0
    2   1           Bill    3           0           0.0                 0
    3   2           Bill    1           1           1.0                 1
    4   2           Steve   2           1           1.0                 0
    5   2           Jane    3           0           0.0                 0
    6   3           Jane    1           1           1.0                 1
    7   3           Bill    2           1           1.0                 0
    8   3           Steve   3           1           0.0                 0
    9   4           Steve   1           2           1.0                 1
    10  4           Jane    2           1           1.0                 0
    11  4           Bill    3           1           0.0                 0
    12  5           Steve   1           3           2.0                 1
    13  5           Jane    2           1           0.0                 0
    14  5           Bill    3           1           0.0                 0
    15  6           Bill    1           2           1.0                 1
    16  6           Steve   2           3           1.0                 0
    17  6           Jane    3           1           0.0                 0
    18  7           Jane    1           2           1.0                 1
    19  7           Bill    2           2           1.0                 0
    20  7           Steve   3           3           0.0                 0
    

    您可以使用删除列 Won

    df.drop('Won', axis = 1, inplace = True)
    

    选项 2:

    df['Won'] = (df['Position'] == 1).astype(int)
    
    df['Total Wins (2 Days)'] = df.groupby('Athlete')['Won'].apply(lambda x: x.add(x.shift())).combine_first(df['Won'])
    

    编辑:对于以 Race Day 为日期的后续问题,您可以通过聚合日、周、月等(根据您的要求)的数据来添加一列,然后找到当前和上一期间的总和。

    df['Race Day'] = pd.to_datetime(df['Race Day'])
    
    df['Won'] = (df['Position'] == 1).astype(int)
    
    
    df['Total Wins Day']=df.groupby(['Athlete', df['Race Day'].dt.day])['Won'].transform('sum')
    df['Total Wins week']=df.groupby(['Athlete', df['Race Day'].dt.week])['Won'].transform('sum')
    df['Total Wins Month']=df.groupby(['Athlete', df['Race Day'].dt.month])['Won'].transform('sum')
    

    现在,如果您想要过去两个月的总获胜次数,您可以使用 Total Wins Month 列并将其与上一列相加

    df['Total Wins (2 Months)'] = df.groupby('Athlete')['Total Wins Month'].apply(lambda x: x.add(x.shift())).combine_first(df['Won'])
    

    【讨论】:

    • 嘿,谢谢。超级有帮助:-) 一个后续问题:关于“.rolling(2)”的参数(即在这种情况下为 2),我如何将参数设置为从其他列派生的值桌子?
    • 嘿,谢谢。超级有帮助:-) 一个后续问题:关于“.rolling(2)”的参数(即在这种情况下为 2),我如何将参数设置为从其他列派生的值桌子?我想要做的是将 Race Day 更改为 datetime 对象(请参阅更新的表格)并计算“Total Wins (X Days)”作为上周、一个月、一年等赢得的比赛数量。 (我正在使用的数据库比上面的示例大)。我更愿意将年份定义为日历年(即在 2014 年 1 月 1 日和 2015 年 1 月 1 日之间赢得的比赛),而不是简单的 265 天。
    • 365 天* 错字抱歉
    猜你喜欢
    • 2019-07-01
    • 2023-03-04
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2020-08-07
    相关资源
    最近更新 更多