[英]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 frequency
的rolling_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.