根据来自另一个数据框的计数将列添加到数据框
adding column to dataframe based on count from another dataframe
我有一个数据框 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
中查找信息的限制是 时间 (因为我只想知道 matchesdf
中排名前的获胜次数=13=]),显然 选手姓名,以及 回合(因为锦标赛的胜利是由赢得决赛来定义的)。
结果应如下所示:
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
谢谢你帮助我。
只需将 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)
我有一个数据框 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
中查找信息的限制是 时间 (因为我只想知道 matchesdf
中排名前的获胜次数=13=]),显然 选手姓名,以及 回合(因为锦标赛的胜利是由赢得决赛来定义的)。
结果应如下所示:
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
谢谢你帮助我。
只需将 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)