/ / python pandas cómo eliminar duplicados de forma selectiva: python, pandas, dataframe

Python Pandas: cómo eliminar duplicados de forma selectiva: Python, Pandas, Dataframe

Necesito mirar todas las filas en una columna ["b"]y si la fila no está vacía, vaya a otra columna correspondiente ["c"] y elimine los duplicados de este índice en particular contra todas las demás filas en esa tercera columna ["c"] mientras mantiene este índice en particular. Me encontré con drop_duplicates, sin embargo, no pude encontrar una manera de buscar solo duplicados de una fila resaltada en lugar de todos los duplicados en una columna. No puedo usar drop_duplicates en toda la columna porque quiero conservar duplicados en esta columna que pueden corresponder solo a valores vacíos en la columna ["b"].

Así que los posibles escenarios serían: si en ["b"] encuentra un valor no vacío, puede ir al índice actual en ["c"] y encontrar todos los duplicados de ese índice UNO y soltarlos. Estos duplicados podrían corresponder a valores vacíos O no vacíos en ["b"]. Si en ["b"] encuentra un valor vacío, salte al siguiente índice. De esta manera es posible que los índices de valores vacíos en ["b"] se eliminen indirectamente porque son duplicados de un índice en ["c"] que corresponde a un valor ["b"] no vacío.

Editado con datos de muestra:

Preprocesado

df1 = pd.DataFrame([["","CCCH"], ["CHC","CCCH"], ["CCHCC","CNHCC"], ["","CCCH"], ["CNHCC","CNOCH"], ["","NCH"], ["","NCH"]], columns=["B", "C"])

df1

B     C
0         CCCH
1   CHC   CCCH
2   CCHCC CNHCC
3         CCCH
4   CNHCC CNOCH
5         NCH
6         NCH

Post procesamiento y eliminación de duplicados correctos:

df2 = pd.DataFrame([["CHC","CCCH"], ["CCHCC","CNHCC"], ["CNHCC","CNOCH"], ["","NCH"], ["","NCH"]], columns=["B", "C"])

df2

B     C
1   CHC   CCCH
2   CCHCC CNHCC
4   CNHCC CNOCH
5         NCH
6         NCH

Arriba vemos el resultado de que las únicas filas.se eliminaron las filas 0,3, ya que son duplicados en la columna ["C"] de la fila 1 que tiene un valor "B" distinto de cero. La fila 5,6 se mantiene aunque sean duplicados entre sí en la columna ["C"] porque no tienen un valor "B" que no sea cero. Las filas 2 y 4 se mantienen porque no están duplicadas en la columna ["C"].

Así que la lógica sería ir a través de cada fila enSi está vacía, desplace la columna "B" una fila y continúe. Si no está vacío, vaya a su columna correspondiente "C" y elimine los duplicados de esa fila de la columna "C" SOLAMENTE mientras conserva ese índice y luego continúe con la siguiente fila hasta que esta lógica se haya aplicado a todos los valores de la columna "B ".

Valor de la columna B vacío -> Mira el siguiente valor en la columna B

| o si no está vacío |

La columna B no está vacía -> Columna C -> Eliminar todos los duplicados de ese índice de la Columna C mientras mantiene el índice actual -> Mire el siguiente valor en la Columna B

Respuestas

1 para la respuesta № 1

Digamos que agrupas tu DataFrame de acuerdo con el "C" columna, y verifique en cada grupo la existencia de un "B"-columna de entrada no vacía:

  • Si no hay tal entrada, devuelva todo el grupo

  • De lo contrario, devuelva el grupo, para las entradas no vacías en "B", con los duplicados caídos

En codigo:

def remove_duplicates(g):
return g if sum(g.B == "") == len(g) else g[g.B != ""].drop_duplicates(subset="B")

>>> df1.groupby(df1.C).apply(remove_duplicates)["B"].reset_index()[["B", "C"]]
B      C
0    CHC   CCCH
1  CCHCC  CNHCC
2  CNHCC  CNOCH
3           NCH
4           NCH