繁体   English   中英

如何删除 pandas dataframe 中的重复项,但根据特定列值保留行

[英]How to drop duplicates in pandas dataframe but keep row based on specific column value

我有一个带有 NBA 球员统计数据的 pandas dataframe,我想删除重复球员的行。 有重复是因为一些球员在 2020-2021 赛季效力于多支球队,我想删除这些重复。 但是,对于这些曾效力于多支球队的球员,该球员在所有球队的综合统计数据也存在一行,并且球队 label 为“TOT”,这表示该球员本赛季效力于 2 支或更多支球队。 当我删除重复的玩家时,我希望保留“TOT”团队的行,而所有其他重复的玩家都消失了。 我不确定如何指定我要删除所有重复项,但将重复项保留在 df['Team'] = 'TOT' 的位置。

这是我的 dataframe 的样子: Dataframe

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

一种方法是使用辅助列。 例如下面的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

如果“团队”值为“TOT”,则创建一个 hte 值为 True 的列,否则为 False 会导致:

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参数来决定要保留什么。 在这种情况下,我们可以通过使用keep=False删除基于playermultiple_teams子集的值来实现所需的结果。 这将意味着两列中的所有重复项都将从 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

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

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

可以这样理解:从我的 dataframe 中取出“Rk”列中不重复的所有行或“Tm”列中具有“TOT”的行。

最后的“:”表示您要获取所有列。

您可以使用key参数对 DataFrame 进行sort ,这样'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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM