Удалить / удалить дубликаты, КРОМЕ, где строка содержит определенную строку - PullRequest
0 голосов
/ 07 октября 2019

Мне нужно удалить все дубликаты с помощью панд, за исключением тех, в которых ячейка содержит определенную строку.

Учитывая, что DF равно:

NAME     ID        
Joe      110
Joe      123
Joe     PENDING
Mary    PENDING
Mary     110
Justin   123

Мне нужно хранить строки там, где'ID' находится в состоянии ожидания, и в то же время отбрасывает остальные дубликаты.

Желаемый вывод выглядит следующим образом:

NAME     ID        
Joe      110
Joe      123
Joe     PENDING
Mary    PENDING

Ответы [ 3 ]

2 голосов
/ 07 октября 2019

Вы можете использовать дубликат :

import pandas as pd

data = [['Joe', 110],
        ['Joe', 123],
        ['Joe', 'PENDING'],
        ['Mary', 'PENDING'],
        ['Mary', 110],
        ['Justin', 123]]

df = pd.DataFrame(data=data, columns=['NAME', 'ID'])

print(df[~df.duplicated('ID') | (df['ID'] == 'PENDING')])

В качестве альтернативы вы можете сделать:

print(df[df.ID.duplicated(keep='last') | df.ID.eq('PENDING')])

Выход

   NAME       ID
0   Joe      110
1   Joe      123
2   Joe  PENDING
3  Mary  PENDING
1 голос
/ 07 октября 2019

Просто добавьте еще один столбец на тот случай, если вы хотите, чтобы имя и идентификатор были уникальными:

import pandas as pd

data = [['Joe', 110],
        ['Joe', 123],
        ['Joe', 'PENDING'],
        ['Mary', 'PENDING'],
        ['Mary', 'PENDING'],
        ['es', 110],
        ['Joe', 110],
        ['Joe', 123]]

df = pd.DataFrame(data=data, columns=['NAME', 'ID'])

df = df[~df.duplicated(['ID', 'NAME']) | (df['ID'] == 'PENDING')]

print(df)
1 голос
/ 07 октября 2019

Используйте Series.duplicated с инвертированием по ~ и цепью по | для ботанического OR со сравнением ID для PENDING для маски для фильтра по boolean indexing:

df = df[~df['ID'].duplicated() | df['ID'].eq('PENDING')]
print (df)
   NAME       ID
0   Joe      110
1   Joe      123
2   Joe  PENDING
3  Mary  PENDING
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...