有没有最佳方法来查找由当前单元格值定义的最后一行?

2024-06-01 02:43:36 发布

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

我有一个熊猫数据框,其中包含有关体育赛事的数据。假设你看到一个冠军,一个失败者和一个匹配者。我正在试图找到上一个包含相同id的获胜者的最后一个索引。 预期的数据帧请参见:

enter image description here

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:

  • 第一行:这里没有什么,因为B是第一个元素。你知道吗
  • 第二行:0,因为winner列中的第二个元素是 与第一列相同。你知道吗
  • 第三行:这里是1,因为C在第二行的loser列中。你知道吗
  • 第4行:0,因为在winner列中,A是第一个元素
  • 第5行:3,因为A是winner列中的最新元素。你知道吗

等等。。。你知道吗

所以第一个直觉是我用for循环遍历loser列,然后将当前元素与loser和winner列中的其他元素进行比较。这很简单,但是执行起来很糟糕,因为每个迭代包含另外两个迭代。有没有更好的方法来加速这一进程?你知道吗

我满怀希望,因为我发现

df['id_of_last_winner'] = data.groupby('winner')['id'].shift()

但这只检查“失败者”列。有更好的主意吗?提前谢谢!你知道吗


Tags: of数据id元素dataframedf性能pd
1条回答
网友
1楼 · 发布于 2024-06-01 02:43:36

由于需要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              |
+ -+  +    +   -+         -+  -+  -+  -+  -+         +

相关问题 更多 >