如何删除概念上的重复项?

2024-10-02 20:32:35 发布

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

我必须处理与此类似的数据集:

    Player  CurrentTeam  PreviousTeam
0   James   Team A       Null
1   David   Team B       Null
2   George  Team C       Null
3   James   Team B       Team A
4   James   Team C       Team B
... ...

在上面的例子中,James实际上是同一个玩家,在数据集中出现了3次。没有身份证之类的东西

这里发生的事情是,詹姆斯实际上是为C队踢球。在C队之前,他在B队,甚至在他进入A队之前(他的职业生涯就是从A队开始的)

然而,我只需要知道他现在的球队(即C队)

我能把詹姆斯过去的球队的所有其他事情都处理掉吗


Tags: 数据玩家事情nullteam例子davidplayer
3条回答

基于this answer中的技术,我们可以去掉任何作为(玩家,前一个团队)组合存在的(玩家,当前团队)组合

>>> df
   Player CurrentTeam PreviousTeam
0   James      Team A         Null
1   David      Team B         Null
2  George      Team C         Null
3   James      Team B       Team A
4   James      Team C       Team B

>>> old_teams = df[["Player", "PreviousTeam"]].rename(columns={"PreviousTeam": "Team"})
>>> all_teams = df[["Player", "CurrentTeam"]].rename(columns={"CurrentTeam": "Team"})
>>> current_teams = (pd.merge(all_teams, old_teams, indicator=True, how="outer")
                       .query("_merge == 'left_only'")
                       .drop("_merge", axis=1)
                       .reset_index(drop=True))
>>> current_teams
   Player    Team
0   David  Team B
1  George  Team C
2   James  Team C

对于这种情况,一种可能的解决方案是将groupbytail一起使用:

df = df.groupby('Player').tail(1)
print(df)

输出

    Player CurrentTeam PreviousTeam
1   David       TeamB         Null
2  George       TeamC         Null
4   James       TeamC        TeamB

使用^{}

new_df = df.drop_duplicates('Player', keep='last')
print(new_df)

如果要选中PreviousTeam,请使用:

df.loc[~df.groupby('Player')['PreviousTeam']
          .shift(-1)
          .eq(df['CurrentTeam'])]

输出

   Player CurrentTeam PreviousTeam
1   David      Team B         Null
2  George      Team C         Null
4   James      Team C       Team B

相关问题 更多 >