/ / python pand jak selektywnie upuszczać duplikaty - python, pandy, ramka danych

python pandy jak usunąć duplikaty selektywnie - python, pandy, ramkę danych

Muszę spojrzeć na wszystkie wiersze w kolumnie ["b"]i jeśli wiersz jest niepusty, przejdź do innej odpowiedniej kolumny ["c"] i upuść duplikaty tego konkretnego indeksu na wszystkie inne wiersze w trzeciej kolumnie ["c"], zachowując ten konkretny indeks. Natknąłem się na drop_duplicates, jednak nie udało mi się znaleźć sposobu, aby szukać tylko duplikatów podświetlonego wiersza, a nie wszystkich duplikatów w kolumnie. Nie mogę używać drop_duplicates w całej kolumnie, ponieważ chcę zachować duplikaty w tej kolumnie, które mogą odpowiadać tylko pustym wartościom w kolumnie ["b"].

Możliwe scenariusze to: jeśli w ["b"] znajdziesz niepustą wartość, możesz przejść do bieżącego indeksu w ["c"] i znaleźć wszystkie duplikaty tego indeksu ONE i upuścić je. Te duplikaty mogą odpowiadać pustym LUB niepustym wartościom w ["b"]. Jeśli w ["b"] znajdziesz pustą wartość, przejdź do następnego indeksu. W ten sposób możliwe jest, że puste indeksy wartości w ["b"] zostaną usunięte pośrednio, ponieważ są duplikatami indeksu w ["c"] odpowiadającego niepustej wartości ["b"].

Edytowane za pomocą przykładowych danych:

Wstępnie przetworzone:

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

Przetwarzanie końcowe i usuwanie poprawnych duplikatów:

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

Powyżej widzimy wynik, że jedyne rzędyusunięto wiersze 0,3, ponieważ są one duplikatami w kolumnie [„C”] wiersza 1, który ma niezerową wartość „B”. Wiersz 5,6 jest zachowywany, mimo że są one duplikatami siebie w kolumnie [„C”], ponieważ nie mają one wartości niezerowej „B”. Wiersze 2 i 4 są przechowywane, ponieważ nie są duplikatami w kolumnie [„C”].

Logika polega więc na przejściu przez każdy wierszkolumna „B”, jeśli jest pusta, przejdź w dół wiersza i kontynuuj. Jeśli nie jest pusty, przejdź do odpowiedniej kolumny „C” i upuść TYLKO wszystkie duplikaty wiersza „C” kolumny, zachowując ten indeks, a następnie przejdź do następnego wiersza, aż ta logika zostanie zastosowana do wszystkich wartości w kolumnie „ „

Kolumna B wartość pusta -> Spójrz na następną wartość w kolumnie B

| lub jeśli nie jest pusty |

Kolumna B nie jest pusta -> Kolumna C -> Usuń wszystkie duplikaty tego indeksu kolumny C, zachowując bieżący indeks -> Spójrz na następną wartość w kolumnie B

Odpowiedzi:

1 dla odpowiedzi № 1

Powiedzmy, że grupujesz ramkę DataFrame zgodnie z "C" i sprawdź każdą grupę pod kątem istnienia "B"-kolumna niepusty wpis:

  • Jeśli nie ma takiego wpisu, zwróć całą grupę

  • W przeciwnym razie zwróć grupę dla niepustych wpisów w "B", z upuszczonymi duplikatami

W kodzie:

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