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

时间:2017-11-09 22:36:46

标签: python pandas

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

enter image description here

总胜率(2天)是运动员在特定日(例如第5天)或前一天(例如第4天)赢得的比赛数量的累积计数 - 因此,它是一个在2天回顾窗口内获胜的次数。 (我可能想将后视窗口改为任何数字)。

例如,在第7天:Jane获得1分,因为她在第7天赢了但在第6天输了;比尔获得1分,因为他在第7天输了,但在第6天赢了。史蒂夫在任何一天都没有获胜。

在第6天,比尔获得1分,因为他在第一天赢了但在第5天输了。史蒂夫得到1,因为他在第6天输了但在第5天赢了。简在两天都赢了。 / p>

计算总胜利(2天)'的最佳方式是什么?在Python?

后续问题

另外,作为一个后续问题:关于'。滚动(2)'的参数。 (即在这种情况下为2),如何将param设置为从表中的其他列派生的值?

我想要做的是将比赛日更改为日期时间对象(请参阅下面更新的表格)并计算总胜利(X天)'因为过去一周,一个月,一年等比赛赢得了比赛。 (我正在使用的数据库比上面的例子大。)

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

enter image description here

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,?

1 个答案:

答案 0 :(得分:2)

创建一个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'])

编辑:对于比赛日为日期的后续问题,您可以通过汇总日,周,月等数据(根据您的要求)添加一列,然后找到当前和上一期间的总和。 / p>

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'])