繁体   English   中英

每组最近n天的计数

[英]count of last n days per group

我有一个这样的DataFrame

df = pd.DataFrame({'Team':['CHI','IND','CHI','CHI','IND','CHI','CHI','IND'],
               'Date':[datetime.date(2015,10,27),datetime.date(2015,10,28),datetime.date(2015,10,29),datetime.date(2015,10,30),datetime.date(2015,11,1),datetime.date(2015,11,2),datetime.date(2015,11,4),datetime.date(2015,11,4)]})

我可以使用它找到游戏之间的休息天数。

df['TeamRest'] = df.groupby('Team')['Date'].diff() - datetime.timedelta(1)

我还想在DataFrame中添加一行,以跟踪每个团队在过去5天内进行了多少场比赛。

Date转换为datetime因此可以将其用作DateTimeIndex ,这对于daily frequencyrolling_count很重要

df.Date = pd.to_datetime(df.Date)

1)计算每队比赛之间的天数差异:

df['days_between'] = df.groupby('Team')['Date'].diff() - timedelta(days=1)

2)计算每队最近5天的比赛滚动数:

df['game_count'] = 1
rolling_games_count = df.set_index('Date').groupby('Team').apply(lambda x: pd.rolling_count(x, window=5, freq='D')).reset_index()
df = df.drop('game_count', axis=1).merge(rolling_games_count, on=['Team', 'Date'], how='left')

要得到:

        Date Team  days_between  game_count
0 2015-10-27  CHI           NaT           1
1 2015-10-28  IND           NaT           1
2 2015-10-29  CHI        1 days           2
3 2015-10-30  CHI        0 days           3
4 2015-11-01  IND        3 days           2
5 2015-11-02  CHI        2 days           3
6 2015-11-04  CHI        1 days           2
7 2015-11-04  IND        2 days           2

如果你要

df = pd.DataFrame({'Team':['CHI','IND','CHI','CHI','IND','CHI','CHI','IND'], 'Date': [date(2015,10,27),date(2015,10,28),date(2015,10,29),date(2015,10,30),date(2015,11,1),date(2015,11,2),date(2015,11,4),date(2015,12,10)]})
df['game'] = 1  # initialize a game to count.
df['nb_games'] = df.groupby('Team')['game'].apply(pd.rolling_count, 5)

您会得到令人惊讶的结果(一个Date更改为一个月后)

         Date Team  game  nb_games
0  2015-10-27  CHI     1         1
2  2015-10-29  CHI     1         2
3  2015-10-30  CHI     1         3
5  2015-11-02  CHI     1         4
6  2015-11-04  CHI     1         5
1  2015-10-28  IND     1         1
4  2015-11-01  IND     1         2
7  2015-12-10  IND     1         3

nb_games=3表示在12月份的较晚日期,过去5天内没有游戏。 除非您转换为datetime ,否则您只计算DataFrame的最后五个条目,因此对于玩了五个以上游戏的团队DataFrame ,您总是会得到五个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM