Трябва да погледна всички редове в колона ["b"]и ако редът не е празен, преминете към друга съответна колона ["c"] и оставете дубликати на този конкретен индекс срещу всички други редове в третата колона ["c"], като запазите този конкретен индекс. Попаднах на drop_duplicates, но не успях да намеря начин да търся само дубликати на маркиран ред, за разлика от всички дубликати в колона. Не мога да използвам drop_duplicates на цялата колона, защото искам да запазя дубликати в тази колона, които могат да съответстват само на празни стойности в колона ["b"].
Така че възможните сценарии ще бъдат: ако в ["b"] откриете непразна стойност, можете да отидете на текущия индекс в ["c"] и да намерите всички дубликати на този ЕДИН индекс и да ги оставите. Тези дубликати могат да съответстват на празни стойности на ИЛИ непразни стойности в ["b"]. Ако в ["b"] откриете празна стойност, преминете към следващия индекс. По този начин е възможно индексите на празни стойности в ["b"] да бъдат премахнати непряко, защото са дубликати на индекс в ["c"], съответстващ на непразна стойност ["b"].
Редактирано с примерни данни:
предварителна обработка:
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
Публикуване на обработка и отхвърляне на правилните дубликати:
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
По-горе виждаме резултата, че единствените редовепремахнати са редове 0,3, тъй като те са дубликати в колона ["C"] на ред 1, който е с нулева стойност "B". Ред 5,6 се запазва, въпреки че те са дубликати един от друг в колона ["C"], тъй като нямат ненулева стойност "B". Редове 2 и 4 се запазват, тъй като не са дубликати в колона ["С"].
Така че логиката би била да преминем през всеки ред вколона "B", ако тя е празна, след това се придвижва надолу по ред и продължава. Ако не е празно, преминете към съответната колона "С" и оставете дубликатите от тази колона "С" ред САМО при запазване на този индекс и след това продължете към следващия ред, докато тази логика не бъде приложена към всички стойности в колона "Б" ".
Стойност на колона B празна -> Погледнете следващата стойност в колона B
| или ако не е празна |. \ t
Колона B не е празна -> Колона C -> Изтрийте всички дубликати на този индекс на колона С, като запазите текущия индекс -> Погледнете следващата стойност в колона Б
Отговори:
1 за отговор № 1Кажете, че групирате своя DataFrame в съответствие с "C"
и проверете всяка група за съществуването на a "B"
-колона без празно място:
Ако няма такъв запис, върнете цялата група
В противен случай, върнете групата за непразните записи в
"B"
, с дублирания
В код:
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