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