Python:使用滚动回溯窗口计算累积和
我正在计算(下表)中“总赢款(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天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天赢了。简两天都没
创建一个韩元列,捕获每行的位置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天*对不起