Python:使用滚动回溯窗口计算累积和

Python:使用滚动回溯窗口计算累积和,python,pandas,Python,Pandas,我正在计算(下表)中“总赢款(2天)”列的值-另请参见下面的逗号分隔值 总胜利(2天)是运动员在给定日期(如第5天)或前一天(如第4天)赢得的比赛数量的累积计数-因此,它是2天回顾窗口内的胜利数量计数。(我可能想将“回望”窗口更改为任意数字) 例如,在第7天:Jane数到1,因为她在第7天赢了,但在第6天输了;比尔数到1,因为他在第7天输了,但在第6天赢了。史蒂夫两天都没有赢 在第6天,比尔数到1,因为他在第6天赢了,但在第5天输了。史蒂夫数到1,因为他在第6天输了,但在第5天赢了。简两天都没

我正在计算(下表)中“总赢款(2天)”列的值-另请参见下面的逗号分隔值

总胜利(2天)是运动员在给定日期(如第5天)或前一天(如第4天)赢得的比赛数量的累积计数-因此,它是2天回顾窗口内的胜利数量计数。(我可能想将“回望”窗口更改为任意数字)

例如,在第7天:Jane数到1,因为她在第7天赢了,但在第6天输了;比尔数到1,因为他在第7天输了,但在第6天赢了。史蒂夫两天都没有赢

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

Python中计算“总胜利(2天)”的最佳方法是什么

后续问题

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

我想做的是将Race Day更改为datetime对象(见下面更新的表格),并将“总胜利(X天)”计算为上周、月份、年份等赢得的比赛数量。(我正在使用的数据库比上面的示例更大)

我更愿意将年份定义为日历年(即2014-01-01和2015-01-01之间赢得的比赛),而不仅仅是265天


创建一个韩元列,捕获每行的位置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
您可以使用删除该列

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'])
编辑:对于以比赛日为日期的后续问题,您可以通过聚合日、周、月等数据(根据您的要求)来添加一列,然后查找当前和以前期间的总和

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')
现在,如果您想要过去两个月的总收益,您可以使用“总收益月”列,并将其与上一列相加

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

创建一个韩元列,捕获每行的位置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
您可以使用删除该列

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'])
编辑:对于以比赛日为日期的后续问题,您可以通过聚合日、周、月等数据(根据您的要求)来添加一列,然后查找当前和以前期间的总和

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')
现在,如果您想要过去两个月的总收益,您可以使用“总收益月”列,并将其与上一列相加

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对象(请参见更新的表格),并将“总胜利(X天)”计算为过去一周、一个月、一年等赢得的比赛数量。(我正在使用的数据库比上面的示例更大)。我更愿意将年份定义为日历年(即2014-01-01和2015-01-01之间赢得的比赛),而不是简单地定义为265天。365天*拼写错误对不起,谢谢。超级有用:-)一个后续问题:关于“.rolling(2)”的参数(即本例中的2),我如何将参数设置为从表中其他列派生的值?嘿,谢谢。超级有用:-)一个后续问题:关于“.rolling(2)”的参数(即本例中的2),我如何将参数设置为从表中其他列派生的值?我想做的是将Race Day更改为datetime对象(请参见更新的表格),并将“总胜利(X天)”计算为过去一周、一个月、一年等赢得的比赛数量。(我正在使用的数据库比上面的示例更大)。我更愿意将年份定义为日历年(即2014-01-01和2015-01-01之间赢得的比赛),而不是简单的265天。365天*对不起