/ / python pandas как да изтрива дубликати селективно - python, pandas, dataframe

Как да се откажа от дублиращите се избирателно - python, pandas, dataframe

Трябва да погледна всички редове в колона ["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