Как удалить дубликаты в кадре данных pandas, но сохранить строку на основе определенного значения столбца

У меня есть фреймворк pandas со статистикой игроков NBA, и я хочу удалить строки с повторяющимися игроками. Есть дубликаты, потому что некоторые игроки играли в нескольких командах в сезоне 2020-2021 годов, и я хочу убрать эти дубли. Однако для этих игроков, которые играли в нескольких командах, также есть строка с объединенной статистикой этого игрока по всем командам и метка команды TOT, которая означает, что этот игрок играл в 2 или более командах в течение сезона. Когда я отбрасываю повторяющихся игроков, я хочу, чтобы строка с командой «ТОТ» оставалась, а все остальные дубликаты исчезли. Я не уверен, как указать, что я хочу удалить все дубликаты, но сохранить дубликат, где df ['Team'] = 'TOT'.

Вот как выглядит мой фрейм данных: Dataframe

В этом примере я хочу отбросить дубликаты игрока «Джарретт Аллен», но оставить строку для Джарретта Аллена, где его команда (Tm) - «ТОТ».


person PaulSG    schedule 01.02.2021    source источник
comment
Измените свой вопрос так, чтобы вся необходимая информация находилась в самом вопросе, а не в прикрепленных изображениях. Вопрос следует сформулировать как MRE.   -  person noah    schedule 01.02.2021


Ответы (3)


Один из способов - использовать вспомогательный столбец. Например, со следующим 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

Создание столбца, в котором значение hte равно True, если значение 'team' равно 'TOT', и 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

Теперь мы можем использовать параметр keep в drop_duplicates (), чтобы решить, что оставить. В этом случае мы можем достичь желаемого результата, отбросив значения на основе подмножества 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
person mullinscr    schedule 01.02.2021

Вы можете просто отфильтровать ненужные строки:

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

Это можно понять так: из моего фрейма данных возьмите все строки, которые не дублируются в столбце «Rk», или строки, у которых есть «TOT» в столбце «Tm».

: в конце означает, что вы хотите взять все столбцы.

person Arkadiusz    schedule 01.02.2021

Вы можете sort DataFrame, используя аргумент 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
person ALollz    schedule 01.02.2021