En python 3 y pandas, necesito eliminar filas duplicadas de un marco de datos repitiendo valores en una columna. Para esto utilicé:

consolidado = df_processos.drop_duplicates(['numero_unico'], keep='last')

La columna "numero_unico" tiene códigos en formato de cadena como 0029126-45.2019.1.00.0000, 0026497-98.2019.1.00.0000, 0027274-83.2019.1.00.0000 ...

Entonces, el comando anterior mantiene solo la última aparición del código de cadena encontrado

¿Alguien sabe cómo usar drop_duplicates con una excepción?

Pero el contenido de la columna no siempre será códigos de cadena. En varias líneas aparece el contenido "Sem número único"

Y quiero mantener todas las líneas donde existe esta excepción. Pero con el comando anterior, el marco de datos generado solo conserva la última aparición de "Sem número único"

1
Reinaldo Chaves 9 oct. 2019 a las 22:15

3 respuestas

La mejor respuesta

Ejemplo de mi comentario sobre el OP,

df = pandas.DataFrame({
    'a': ['snu', 'snu', '002', '002', '003', '003'], 
    'b': [1, 2, 2, 1, 5, 6]
})
df_dedupe = pandas.concat([ 
    df[df['a']=='snu'], 
    df[df['a']!='snu'].drop_duplicates(['a'], keep='last') 
])
1
Gabriel 9 oct. 2019 a las 19:27

Similar a las otras respuestas, pero en un comando de varias líneas que usa el método duplicado ():

consolidado = df_processos[
    df_processos['numero_unico'] == "Sem número único" |
    ~df_processos[df_processos['numero_unico'] != "Sem número único"].duplicated(
        subset='numero_unico', keep='last'
    )
]

Enlace

2
ymzkala 9 oct. 2019 a las 19:44

No hay ningún parámetro en los pandas drop_duplicates que pueda usar, pero puede sortearlo separando el DataFrame en dos partes (con "Sem número único" y sin), y luego concat nuevamente después de deduplicar . Como tal:

tmp_df1 = df_processos[df_processos['numero_unico']=="Sem número único"]
tmp_df2 = df_processos[df_processos['numero_unico']!='Sem número único']
tmp_df2 = tmp_df2.drop_duplicates(['numero_unico'], keep='last')
new_df = pd.concat([tmp_df1, tmp_df2])
1
Andy 9 oct. 2019 a las 19:26
58310836