我的数据框ranksdf
包含player names
,dates
,以及每个日期的ranking
。日期列是已解析的datetime
对象(可能与以后的日期比较相关):
player date ranking
A 20120601 1
B 20120601 2
C 20120601 3
A 20130601 1
B 20130601 2
C 20130601 3
我想要做的是添加一个新列,在该日期之前计算每个玩家的tournament wins
。有关锦标赛胜利的信息来自另一个名为matchesdf
的数据框:
t_name t_date w_name round
X 20120101 A F
X 20120101 A SF
Y 20120201 B F
Y 20120201 B SF
Z 20130101 A F
t_name
=锦标赛名称t_date
=锦标赛日期w_name
=获胜者名称round
=锦标赛中的回合。 F
=最终,SF
=半决赛从第二个数据框中我知道 特定的玩家在给定时间通过计算圆等于F
的行来赢得锦标赛。
所以我想做的是向ranksdf
添加一个新列,计算锦标赛胜利,但只到ranksdf.date
。
在伪代码中是这样的:ranksdf['t_wins'] = ranksdf.apply(lambda x: matchesdf[(matchesdf['t_date'] < x['date']) & (matchesdf['w_name'] == x['player']) & (matchesdf['round'] == 'F')].count())
因此,在matchesdf
中查找信息的限制是时间(因为我想知道在ranksdf
中排名之前的胜利) ,显然球员名称和轮(因为锦标赛胜利是通过赢得决赛来定义的。)
结果应如下所示:
player date ranking t_wins
A 20120601 1 1
B 20120601 2 1
C 20120601 3 0
A 20130601 1 2
B 20130601 2 1
C 20130601 3 0
感谢您的帮助。
答案 0 :(得分:1)
只需将axis = 1添加到您的应用功能中即可使用:
ranksdf["t_wins"] = ranksdf.apply(lambda x: len(matchesdf[(matchesdf['t_date'] < x['date']) & (matchesdf['w_name'] == x['player']) & (matchesdf['round'] == 'F')]), axis =1)