python panda 库 累积分布,Python Pandas:使用滚动回溯窗口计算累计总和

我正在计算(下表)中的“总获胜(2天)”列的值-逗号分隔值也请参见下文。

riZFF.png

总胜利数(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天。

lE6Ud.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值