![](/img/trans.png)
[英]How to drop Pandas DataFrame rows with condition to keep specific column value
[英]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() function的keep
参数来决定要保留什么。 在这种情况下,我们可以通过使用keep=False
删除基于player
和multiple_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.