我正在计算(下表)中的“总获胜(2天)”列的值-逗号分隔值也请参见下文。
总胜利数(2天)是该运动员在该天(例如第5天)或前一天(例如第4天)获胜的比赛次数的累积计数-因此,它是2天后窗内的获胜次数。(我可能想将回溯窗口更改为任何数字)。
例如,在第7天:Jane赢得了1分,因为她在第7天赢了,但在第6天输了;比尔得到1的计数,因为他在第7天输了,但在第6天赢了。史蒂夫在任何一天都没有赢。
在第6天,Bill得到1的计数,因为他在Day的第9天赢了,但是在第5天输了。Steve得到了1的计数,因为他在第6天输了,但是在Day 5了。
用Python计算“总胜利(2天)”的最佳方法是什么?
后续问题
另外,作为后续问题:关于'.rolling(2)'的参数(即本例中为2),我如何将参数设置为从表中其他列派生的值?
我想做的是将“比赛日”更改为日期时间对象(请参见下表更新),并根据上周,月份,年份等赢得的比赛次数来计算“总胜利(X天)”。(我正在使用的数据库大于上面的示例)。
我宁愿将Year定义为日历年(即在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,?
解决方案
创建一个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'])