Necesito soltar todos los duplicados usando Pandas, excepto aquellos en los que la celda contiene una cadena determinada.

Dado que DF es:

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

Necesito mantener filas donde 'ID' está PENDIENTE, y al mismo tiempo descartar el resto de los duplicados.

La salida deseada se ve así:

NAME     ID        
Joe      110
Joe      123
Joe     PENDING
Mary    PENDING
0
VRumay 7 oct. 2019 a las 15:34

3 respuestas

La mejor respuesta

Puede usar duplicado:

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')])

Como alternativa, puede hacer:

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

Salida

   NAME       ID
0   Joe      110
1   Joe      123
2   Joe  PENDING
3  Mary  PENDING
2
Dani Mesejo 7 oct. 2019 a las 12:49

Utilice Series.duplicated con invertir por ~ y encadenar por | para botwise OR con comparar ID para PENDING para máscara para filtrar por 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
1
jezrael 7 oct. 2019 a las 12:36

Simplemente agregue otra columna en caso de que quiera mantener el Nombre y la ID únicos:

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
elomat 7 oct. 2019 a las 13:39
58269642