/ / Python Panda come rilasciare i duplicati in modo selettivo - python, panda, dataframe

i panda di pitone come rilasciare i duplicati in modo selettivo - python, panda, dataframe

Ho bisogno di guardare tutte le righe in una colonna ["b"]e se la riga non è vuota, passare a un'altra colonna corrispondente ["c"] e rilasciare i duplicati di questo particolare indice su tutte le altre righe nella terza colonna ["c"] preservando questo particolare indice. Mi sono imbattuto in drop_duplicates, tuttavia non sono riuscito a trovare un modo per cercare solo i duplicati di una riga evidenziata rispetto a tutti i duplicati in una colonna. Non posso usare drop_duplicates sull'intera colonna perché voglio conservare i duplicati in questa colonna che potrebbero corrispondere solo ai valori vuoti nella colonna ["b"].

Quindi possibili scenari potrebbero essere: se in ["b"] trovi un valore non vuoto, puoi andare all'indice corrente in ["c"] e trovare tutti i duplicati di quell'indice ONE e rilasciarli. Questi duplicati potrebbero corrispondere a valori O vuoti e non vuoti in ["b"]. Se in ["b"] trovi il valore vuoto salta all'indice successivo. In questo modo è possibile che gli indici di valori vuoti in ["b"] vengano rimossi indirettamente perché sono duplicati di un indice in ["c"] corrispondente a un valore non vuoto ["b"].

Modificato con dati di esempio:

pre-elaborato:

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 Elaborazione e eliminazione di duplicati corretti:

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

Sopra vediamo il risultato che le uniche righerimosso erano le righe 0,3 in quanto sono duplicati nella colonna ["C"] della riga 1 che ha un valore "B" diverso da zero. Le righe 5,6 vengono mantenute anche se sono duplicate l'una dall'altra nella colonna ["C"] perché non hanno un valore "B" diverso da zero. Le righe 2 e 4 vengono mantenute perché non sono duplicati nella colonna ["C"].

Quindi la logica sarebbe passare attraverso ogni riga incolonna "B" se è vuota, quindi spostare verso il basso una riga e continuare. Se non è vuoto, vai alla colonna corrispondente "C" e rilascia SOLO i duplicati di quella colonna "C" SOLO conservando tale indice e quindi continua alla riga successiva fino a quando questa logica è stata applicata a tutti i valori nella colonna "B" ".

Colonna B valore vuoto -> Guarda il prossimo valore nella colonna B

| o se non vuoto |

Colonna B non vuota -> Colonna C -> Elimina tutti i duplicati di quell'indice della colonna C mantenendo l'indice corrente -> Guarda il valore successivo nella colonna B

risposte:

1 per risposta № 1

Supponi di raggruppare il tuo DataFrame in base a "C" colonna e controlla ciascun gruppo per l'esistenza di a "B"-colonna non vuota:

  • Se non esiste tale voce, restituire l'intero gruppo

  • Altrimenti, restituire il gruppo, per le voci non vuote in "B", con i duplicati caduti

Nel codice:

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