2016-08-09 4 views
0

У меня есть набор данных:Панды: в случае повторяющихся значений, удалить строку с определенным значением в другом столбце

id url  keep_anyway field 
1  A.com Yes   X 
2  A.com Yes   Y 
3  B.com No   Y 
4  B.com No   X 
5  C.com No   X 

Я хочу удалить «URL» дублей с условиями:

  1. Храните дубликаты, если «keep_anyway» = «Да».
  2. Для дубликатов с «keep_anyway» = «Нет», я хочу сохранить строку с «X» в столбце «поле».

Ожидаемый результат:

id url  keep_anyway field 
1  A.com Yes   X 
2  A.com Yes   Y 
4  B.com No   X 
5  C.com No   X 

Я был в состоянии управлять состояние 1 с:

df.loc[(df['keep_aanyway'] =='Yes') | ~df['url'].duplicated()] 

Но как установить условие 2?

Обратите внимание, что возможные значения столбца «поле» являются либо X, либо Y, и если у меня есть дубликаты, я знаю, УВЕРЕН, что у меня есть одно «X» и одно значение «Y».

Я подумал, что, может быть, я мог бы сортировать от А до Я в столбце «поле», а затем «keep_first» = True в df.duplicated, но я думаю, что он устарел, не так ли?

ответ

2

Попробуйте это:

import numpy as np 

duplicates = df.duplicated(subset='url') 
keep_anyway_bool = df['keep_away'] == 'Yes' # (credit @acushner for pointing this out) 
field_bool = df['field'] == 'X' # (credit @acushner for pointing this out) 

df[np.invert(duplicates) | keep_anyway_bool | field_bool] 
+2

вам нужен 'np.where' там? вы не можете просто сделать 'field_bool = df.field == 'X''? – acushner

+1

Да, я изначально пытался получить все в одной строке, отсюда и «np.where». Я собирался их вложить, а затем понял, что условия должны быть «or'ed вместе ... – Kartik

+0

NameError: имя« np »не определено, почему? – Vincent