【发布时间】:2021-09-02 03:06:14
【问题描述】:
我有两个 DataFrame,一个包含不同的日期和不同的 player_id。第二个包含每个玩家评分的历史记录,这意味着它包含不同的日期和不同的 player_id 和 player_rating ,每行都有唯一的 id。
现在,我想通过比较两个 DataFrame 中的日期列,向第一个 DataFrame 添加一个值为 player_rating 的列。
例如:
print(df_1)
date player_id
0 2006 1
1 2006 2
2 2012 3
3 2008 2
4 2010 1
print(df_2)
date player_id player_rating
0 2005 1 50
1 2007 2 55
2 2005 3 70
3 2005 2 65
4 2009 1 60
5 2011 2 75
6 2011 3 85
在这里,我应该将 df_1 中的第一行与 df_2 中的第一和第五行(相同的 player_id)进行比较,然后从 df_2 中选择更新日期最新且小于 df_1 日期的行。所以,我应该选择第一行并将 player_rating 设置为 50。
最后,我应该得到:
print(df_1)
date player_id player_rating
0 2006 1 50
1 2006 2 65
2 2012 3 85
3 2008 2 55
4 2010 1 60
我尝试了很多解决方案并得到了以下想法,但是相对于一个巨大的数据集(大约一百万行 df_1 和 +100k 行 df_2)运行需要很长时间:
def get_rating(date, player_id):
return df_2[(df_2['player_id']==player_id) & (df_2['date'] < date)].sort_values(by=['date'], ascending=False).player_rating.iloc[0]
df_1['player_rating'] = [get_rating(x,y) for x, y in zip(df_1['date'], df_1['player_id'])]
如果有更好的方法来节省一些时间? 提前谢谢你。
【问题讨论】: