包含“上一行”条件和的DataFrame Add列

2024-09-27 18:24:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个网球比赛结果的数据集如下:

tennis_cols = ['Year','TourNo','MatchNo','Round','Winner','Loser']
tennis_rslts = [ [2018, 1, 1, 'QF', 'PlayerA', 'PlayerB']
                ,[2018, 1, 2, 'QF', 'PlayerC', 'PlayerD']
                ,[2018, 1, 3, 'QF', 'PlayerE', 'PlayerF']
                ,[2018, 1, 4, 'QF', 'PlayerG', 'PlayerH']
                ,[2018, 1, 5, 'SF', 'PlayerA', 'PlayerC']
                ,[2018, 1, 6, 'SF', 'PlayerE', 'PlayerG']
                ,[2018, 1, 7, 'F',  'PlayerA', 'PlayerE'] ]
dfTennis=pd.DataFrame(tennis_rslts,columns=tennis_cols)
dfTennis

    Year    TourNo  MatchNo Round   Winner     Loser    
0   2018    1       1       QF      PlayerA    PlayerB
1   2018    1       2       QF      PlayerC    PlayerD
2   2018    1       3       QF      PlayerE    PlayerF
3   2018    1       4       QF      PlayerG    PlayerH
4   2018    1       5       SF      PlayerA    PlayerC
5   2018    1       6       SF      PlayerE    PlayerG
6   2018    1       7       F       PlayerA    PlayerE

我想添加一个列WinsToDate,它包含了这场比赛的获胜者在当前比赛之前的获胜次数,即:

    Year    TourNo  MatchNo Round   Winner     Loser    WinsToDate  
0   2018    1       1       QF      PlayerA    PlayerB  0
1   2018    1       2       QF      PlayerC    PlayerD  0 
2   2018    1       3       QF      PlayerE    PlayerF  0
3   2018    1       4       QF      PlayerG    PlayerH  0
4   2018    1       5       SF      PlayerA    PlayerC  1  <-- PlayerA won MatchNo 1
5   2018    1       6       SF      PlayerE    PlayerG  1  <-- PlayerE won MatchNo 3
6   2018    1       7       F       PlayerA    PlayerE  2  <-- PlayerA won MatchNo 1 and 5

我的真实世界数据集足够大,遍历数据集的速度太慢。你知道我如何有效地达到这个结果吗?你知道吗

本质上,我想计算胜利者匹配正在处理的行并且MatchNo小于当前正在处理的行的行数。你知道吗

**更新** 我可以通过以下方法获得获奖者在数据帧中出现的次数:

dfTennis['Count'] = list(map(lambda x : len(dfTennis[(dfTennis['Winner'] == x)]), dfTennis['Winner']))

但这将统计所有事件,而不是当前行之前的所有事件。你知道吗


Tags: 数据sfyearroundqfwinnertennisloser
1条回答
网友
1楼 · 发布于 2024-09-27 18:24:16

奇怪的是,我要回答我自己的问题。你知道吗

计算WinsToDate列所需的代码是:

dfTennis['WinsToDate'] = list(map(lambda x : len(dfTennis[(dfTennis['Winner'] == dfTennis.iloc[x]['Winner']) & 
                                                          (dfTennis['MatchNo'] < dfTennis.iloc[x]['MatchNo'])]), dfTennis.index.values))

通过将索引值传递给lambda函数,意味着我可以访问Winner和MatchNo字段中的数据来应用所需的逻辑。你知道吗

我很高兴听到任何更好的解决方案,但这似乎为我的需要工作。你知道吗

相关问题 更多 >

    热门问题