2016-09-22 3 views
1

Мне нужно посмотреть на все строки в столбце ['b'], а если строка непустая, перейдите в другой соответствующий столбец ['c'] и удалите дубликаты этого конкретного индекс против всех остальных строк в этом третьем столбце ['c'], сохраняя этот конкретный индекс. Я столкнулся с drop_duplicates, однако мне не удалось найти способ искать дубликаты выделенной строки, а не всех дубликатов в столбце. Я не могу использовать drop_duplicates во всем столбце, потому что я хочу сохранить дубликаты в этом столбце, которые могут соответствовать только пустым значениям в столбце ['b'].python pandas как выборочно удалять дубликаты

Возможны следующие сценарии: если в ['b'] вы найдете непустое значение, вы можете перейти к текущему индексу в ['c'] и найти все дубликаты этого ОДНОГО индекса и удалить их. Эти дубликаты могут соответствовать пустым ИЛИ непустым значениям в ['b']. Если в ['b'] вы обнаружите пустое значение, перейдите к следующему индексу. Таким образом, возможно, что пустые значения индексов в ['b'] удаляются косвенно, потому что они являются дубликатами индекса в ['c'], соответствующих непустому значению ['b'].

Отредактировано С Sample Data:

препроцессированные:

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 сохраняются, потому что они не дублируются в столбце ['C'].

Таким образом, логика должна проходить через каждую строку в столбце «B», если она пуста, а затем двигаться вниз по строке и продолжать. Если он не пуст, перейдите к соответствующему столбцу «C» и удалите любые дубликаты этой строки «C» ТОЛЬКО при сохранении этого индекса, а затем перейдите к следующей строке до тех пор, пока эта логика не будет применена ко всем значениям в столбце «B» ».

значение столбца B пусто -> Посмотрите на следующее значение в колонке B

| или если не пусто |

Колонка B не пусто -> Колонка C -> Отбросьте все дубликаты этого индекса столбца C, сохраняя при этом текущий индекс -> Посмотрите на следующее значение в колонке B

+3

Можете ли вы предоставить некоторые образцы данных? (http://stackoverflow.com/help/mcve) – Thanos

+1

И: [Как сделать хорошие воспроизводимые примеры панд] (http: // stackoverflow.com/questions/20109391/примеры использования-хороших-воспроизводимых-панд) – IanS

+0

Отредактировано с помощью примера данных – lucas305

ответ

0

Say вам группировать ваши DataFrame по в 'C' колонки, и проверить каждую группу для существования 'B' -column непустой записи:

  • Если нет такой записи, вернуть всю группу

  • в противном случае, вернуть группа, для непустых записей в '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 
+0

Это выглядит очень многообещающе - Спасибо! Однако я столкнулся с некоторыми ошибками: «ValueError: метки ['level_1'] не содержатся в оси. То, как я его запускал, это сделать df2 = df1.groupby ...... это неправильно? – lucas305

+0

@ lucas305 Не знаете, почему у вас это получилось, но часть с 'level_1' на самом деле была избыточной, и я удалил ее. Можете ли вы попробовать еще раз в соответствии с приведенным выше обновлением? –

+0

Хорошо! Это происходило без ошибок. Это не совсем тот результат, который мне нужен, - слишком много информации теряется. Поэтому в оригинале df каждая строка индексируется идентификатором молекулы, который соответствует конкретным данным в этой строке. Это становится потерянным после преобразования, поскольку индекс теперь является целым числом от 0 до n. Также новое пост-преобразование df имеет только столбцы B и C, все остальные столбцы удалены. Мне нужно сохранить всю другую информацию. В принципе, это должно только сбрасывать дубликаты, но сохранить все остальное одинаково. – lucas305

Смежные вопросы