python - Pandas DataFrame - 添加包含“先前”行的条件总和的列
问题描述
我有一个网球比赛结果数据集,如下所示:
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 小于正在处理的当前行的行数。
** 更新 ** 我可以使用以下方法计算获胜者在 Dataframe 中出现的次数:
dfTennis['Count'] = list(map(lambda x : len(dfTennis[(dfTennis['Winner'] == x)]), dfTennis['Winner']))
但这会计算所有出现而不是当前行之前的所有出现。
解决方案
奇怪的是,我要回答我自己的问题。
计算 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 字段中的数据以应用我需要的逻辑。
欢迎听到任何更好的解决方案,但这似乎符合我的需要。
推荐阅读
- javascript - 获取对象内部对象的索引
- python - (Python 3) 输出问题
- ruby-on-rails - Rails 比较 2 个不同集合中的值
- php - 显示/隐藏自定义 WordPress 菜单
- visual-studio-app-center - 微软应用中心支持百度推送吗?
- reactjs - 如何为 react-select Async 设置 defaultValue 并且在 v2.0.0 的 onBlur 时不重置?
- azure - 创建加入域的 hdinsight 集群时的问题
- excel - 如何生成具有二项分布的随机数?
- jquery - Highchart Json 与传统的 JSON 数据不同
- vb.net - call function in vb.net vs 2015