我有一个有NBA球员统计数据的pandas数据框,我想删除重复的球员行。有重复的,因为有些球员在2020-2021赛季在多支球队踢球,我想删除这些重复的东西。然而,对于这些在多个球队踢球的球员,还会有一个行,其中包含该球员在所有球队的组合统计数据和团队标签'TOT',这表示该球员在本赛季在两支或更多球队比赛的事实。当我删除重复的球员时,我希望与“TOT”团队的行保留下来,而所有其他重复的球员都消失了。我不确定如何指定要删除所有重复项,但将复制项保留在df‘’Team‘= 'TOT’的位置。
下面是我的数据帧的样子:Dataframe
在本例中,我想删除球员'Jarrett Allen‘的副本,但保留Jarrett Allen的行,其中他的团队(Tm)是'TOT’。
发布于 2021-02-02 03:55:58
您可以只过滤掉不必要的行:
df = df.loc[(df['Rk'].duplicated(keep=False) == False) | (df['Tm'] == 'TOT'), :]可以这样理解:从我的数据帧中取出列'Rk‘中没有重复的所有行,或者列'Tm’中有'TOT‘的行。
":“末尾的意思是你想要取所有列。
发布于 2021-02-02 03:49:51
一种方法是使用帮助器列。例如利用下面的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参数来决定要保留的内容。在这种情况下,我们可以通过使用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发布于 2021-02-02 04:01:27
您可以使用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 TOThttps://stackoverflow.com/questions/65998730
复制相似问题