Удалить дубликаты на основе условия в pandas - PullRequest
1 голос
/ 20 января 2020

У меня есть фрейм данных, как показано ниже

ID     STATUS
1      Active
1      Completed
2      Active
3      Completed
4      Completed
4      Active

Из вышеперечисленного я хотел бы удалить дубликат ID и сохранить статус с активным.

Ожидаемый результат:

ID     STATUS
1      Active
2      Active
3      Completed
4      Active

1 Ответ

2 голосов
/ 20 января 2020

Первая идея - это группы фильтров без Active по GroupBy.transform и GroupBy.all с маской по Series.ne для неравных и цепных с инвертированной маской по ~:

m = df['STATUS'].ne('Active')

df = df[m.groupby(df['ID']).transform('all') | ~m]
print (df)
   ID     STATUS
0   1     Active
2   2     Active
3   3  Completed
5   4     Active

Другая идея - преобразовать все STATUS в упорядоченные Categorical с, поэтому при сортировке и удалении дубликатов получают Active, если существуют другие другие значения по приоритету с положение значений списка c:

c = ['Active','Completed']
df['STATUS'] = pd.Categorical(df['STATUS'], ordered=True, categories=c)

df = df.sort_values(['ID','STATUS']).drop_duplicates(subset=['ID'])
print (df)
   ID     STATUS
0   1     Active
2   2     Active
3   3  Completed
5   4     Active
...