如何删除熊猫数据框中的重复项但根据特定列值保留行

时间:2021-02-01 19:10:28

标签: python pandas dataframe duplicates drop

我有一个包含 NBA 球员统计数据的 Pandas 数据框,我想删除重复球员的行。有重复是因为有些球员在 2020-2021 赛季效力于多支球队,我想删除这些重复。但是,对于这些在多支球队打过球的球员,还有一行是该球员在所有球队中的综合统计数据以及球队标签“TOT”,这表示该球员本赛季效力于 2 支或更多球队。当我删除重复的球员时,我希望保留“TOT”团队的那一行,而所有其他重复的球员都消失了。我不确定如何指定我要删除所有重复项,但在 df['Team'] = 'TOT' 处保留重复项。

这是我的数据框的样子:Dataframe

在此示例中,我想删除玩家“Jarrett Allen”的重复项,但保留 Jarrett Allen 的行,其中他的团队 (Tm) 为“TOT”。

3 个答案:

答案 0 :(得分:0)

一种方法是使用辅助列。例如下面的 df,

    player  stats team
0      bob      1  ABC
1    alice      2  DEF
2  charlie      3  GHI
3     mary      4  JKL
4     mary      5  MNO
5     mary      6  TOT
6      bob      7  TOT
7      bob      8  VWX

如果 'team' 值为 'TOT',则创建一个 hte 值为 True 的列,否则会导致:

import numpy as np

df['multiple_teams'] = np.where(df['team']=='TOT', 'TOT', None)

    player  stats team  multiple_teams
1    alice      2  DEF           False
0      bob      1  ABC           False
6      bob      7  TOT            True
7      bob      8  VWX           False
2  charlie      3  GHI           False
3     mary      4  JKL           False
4     mary      5  MNO           False
5     mary      6  TOT            True

现在我们可以使用 drop_duplicates() functionkeep 参数来决定要保留什么。在这种情况下,我们可以通过使用 player 删除基于 multiple_teamskeep=False 的子集的值来实现所需的结果。这意味着两列中的所有重复项都将从 df 中删除。结果:

    player  stats team  multiple_teams
1    alice      2  DEF           False
6      bob      7  TOT            True
2  charlie      3  GHI           False
5     mary      6  TOT            True

答案 1 :(得分:0)

您可以过滤掉不必要的行:

df = df.loc[(df['Rk'].duplicated(keep=False) == False) | (df['Tm'] == 'TOT'), :]

可以这样理解:从我的数据框中获取在“Rk”列中没有重复的所有行或在“Tm”列中具有“TOT”的行。

":" 结尾表示要取所有列。

答案 2 :(得分:0)

您可以使用 sort 参数 key 数据帧,这样 'TOT' 被排序到底部,然后 drop_duplicates,保留最后一个。

这保证了最终每个玩家只有一行,即使数据很混乱并且可能有多个 'TOT' 行用于单个玩家、一个团队和一个 'TOT' 行,或多个团队和多个 'TOT' 行。

df = (df.sort_values('team', key=lambda x: x.eq('TOT'))
        .drop_duplicates('player', keep='last'))

print(df)
#    player  stats team
#0    alice      2  DEF
#1      bob      7  TOT
#2      bob      1  ABC
#3  charlie      3  GHI
#4     mary      4  JKL
#5     mary      5  MNO
#6     mary      6  TOT

df = (df.sort_values('team', key=lambda x: x.eq('TOT'))
        .drop_duplicates('player', keep='last'))

print(df)
#    player  stats team
#0    alice      2  DEF
#3  charlie      3  GHI
#1      bob      7  TOT
#6     mary      6  TOT