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 № 1Powiedzmy, ż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