问题描述
我有一个包含 NBA 球员统计数据的 Pandas 数据框,我想删除重复球员的行。有重复是因为有些球员在 2020-2021 赛季效力于多支球队,我想删除这些重复。但是,对于这些在多支球队打过球的球员,还有一行是该球员在所有球队中的综合统计数据以及球队标签“TOT”,这表示该球员本赛季效力于 2 支或更多球队。当我删除重复的球员时,我希望保留“TOT”团队的那一行,而所有其他重复的球员都消失了。我不确定如何指定我要删除所有重复项,但在 df['Team'] = 'TOT' 处保留重复项。
这是我的数据框的样子: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
如果 '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() function 的 keep
参数来决定要保留什么。在这种情况下,我们可以通过使用 player
删除基于 multiple_teams
和 keep=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
,
您可以过滤掉不必要的行:
df = df.loc[(df['Rk'].duplicated(keep=False) == False) | (df['Tm'] == 'TOT'),:]
可以这样理解:从我的数据框中获取在“Rk”列中没有重复的所有行或在“Tm”列中具有“TOT”的行。
":" 结尾表示要取所有列。
,您可以使用 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',keep='last'))
print(df)
# player stats team
#0 alice 2 DEF
#3 charlie 3 GHI
#1 bob 7 TOT
#6 mary 6 TOT