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 № 1Digamos 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