python - 有没有找到由当前单元格值定义的最后一行的最佳方法?
问题描述
我有一个熊猫数据框,其中包含有关体育赛事的数据。假设您在其中看到了一个winner_id、一个loser_id和一个match_id。我正在尝试查找具有相同 ID 的先前包含的获胜者的最后一个索引。预期的数据框请参见此处:
d = {'winner':["A","B","C","A","A","C","B","D"], 'loser':["B","C","D","D","D","B","A","C"], 'id':[1,2,3,4,5,6,7,8], 'id_of_last_winner:' ["", 0, 1, 0, 3, 2, 5, 4]}
df = pd.DataFrame(d)
df
如果我遍历列,它的表现非常糟糕。我的代码的期望应该是这样的: id_of_last_winner:
- 第一行:这里什么都没有,因为 B 是第一个元素。
- 第 2 行:0 因为获胜者列中的第二个元素与失败者列中的第一个元素相同。
- 第 3 行:这里是 1,因为 C 在第 2 行的失败者列中。
- 第 4 行:0 因为在获胜者列中 A 是第一个元素
- 第 5 行:3 因为 A 是获胜者列中的最新元素。
等等...
所以第一个直觉是我用 for 循环遍历失败者列,然后将当前元素与失败者和获胜者列中的其他元素进行比较。这很简单,但执行起来很糟糕,因为每次迭代都包含另外 2 次迭代。有没有更好的方法来加快这个过程?
我满怀希望,因为我发现
df['id_of_last_winner'] = data.groupby('winner')['id'].shift()
但这仅检查失败者列。有更好的主意吗?提前致谢!
解决方案
您根据需要让它有点混乱,id
但预期的输出使用index
. 这是一个使用示例id
:
# create a list of players
players = list(set(df.winner).union(set(df.loser)) )
# create last game's id for each player
for player in players:
df[player] = df.id.where((df.winner==player) | (df.loser==player) ).\
ffill().shift()
# here's our result
df['winner_last_game'] = df.apply(lambda r: r[r.winner], axis=1)
显然,如果您有大量玩家,它就不起作用,但它应该适用于数百名玩家。这是输出
+---+----+--------+-------+-------------------+-----+-----+-----+-----+------------------+
| | id | winner | loser | id_of_last_winner | A | C | D | B | winner_last_game |
+---+----+--------+-------+-------------------+-----+-----+-----+-----+------------------+
| 0 | 1 | A | B | | NaN | NaN | NaN | NaN | NaN |
| 1 | 2 | B | C | 0 | 1.0 | NaN | NaN | 1.0 | 1.0 |
| 2 | 3 | C | D | 1 | 1.0 | 2.0 | NaN | 2.0 | 2.0 |
| 3 | 4 | A | D | 0 | 1.0 | 3.0 | 3.0 | 2.0 | 1.0 |
| 4 | 5 | A | D | 3 | 4.0 | 3.0 | 4.0 | 2.0 | 4.0 |
| 5 | 6 | C | B | 2 | 5.0 | 3.0 | 5.0 | 2.0 | 3.0 |
| 6 | 7 | B | A | 5 | 5.0 | 6.0 | 5.0 | 6.0 | 6.0 |
| 7 | 8 | D | C | 4 | 7.0 | 6.0 | 5.0 | 7.0 | 5.0 |
+---+----+--------+-------+-------------------+-----+-----+-----+-----+------------------+
推荐阅读
- java - 在 itemListener 中确定 JCheckBox 的标识
- css - CSS flex:防止孙子溢出(即强制滚动)
- python - 环境/身份验证可能存在问题 - BigQuery 管理员:{invalid_grant, Invalid JWT Signature}
- php - JQuery 未检测到数据属性
- python - 命令行参数在 python 中不起作用
- numpy - SIice 基于间隔的 numpy 数组?
- protocol-buffers - 在 Charles 中重写协议缓冲区响应。Content-Type 标头中未指定“desc”参数
- sql-server - 使用 SqlBulkCopy 在传输前修改列内容
- python - 如何在python中创建一个动态二维数组
- javascript - 倒计时仅在页面刷新时停止