Панды - фильтровать строки, в которых столбцы совпадают по крайней мере один раз - PullRequest
0 голосов
/ 05 октября 2018

У меня есть кадр данных pandas, как показано ниже:

Name ID1    ID2
Joe  248    248
Joe  248    326
Joe  721    248
Anna 295    295
Bob  721    248
Bob  721    326
Bob  248    566

Мне нужно сохранить только те строки, которые не имеют совпадающие ID1 и ID2, за исключением того, что, если оба идентификатора совпадают хотя бы один раздля Имени, затем отбросьте их.

Например:

Для Имени = Джо, идентификаторы совпадают один раз (248), поэтому удаляет все строки с Джо .

Для Имени = Боба, идентификаторы никогда не совпадают, поэтому сохраните все строки с Бобом .

Пока я пробовал:

Удаление дубликатов путем сортировкиимена и проверка соответствия идентификаторов или нет.Но это не учитывает идентификаторы, совпадающие хотя бы один раз.

df  = df.sort_values(['Name']).drop_duplicates(['Name'],keep='first')  

Не уверен, что панды могут отбрасывать дубликаты при условии, что что-то соответствует «по крайней мере, один раз».

Ответы [ 2 ]

0 голосов
/ 05 октября 2018
df.groupby('Name').apply(lambda grp: grp if not (grp['ID1'] == grp['ID2']).any() else None).dropna()

Объяснение: Groupby Name, затем, если есть какой-либо индекс, для которого ID1 и Id2 НЕ совпадают, вернуть группу.В противном случае верните None, а затем отбросьте пустые столбцы.

0 голосов
/ 05 октября 2018

Если я правильно понимаю, вы можете вычислить имена для удаления и затем использовать логическое индексирование:

names_to_remove = df.loc[df['ID1'] == df['ID2'], 'Name'].values

res = df[~df['Name'].isin(names_to_remove)]

print(res)

  Name  ID1  ID2
4  Bob  721  248
5  Bob  721  326
6  Bob  248  566
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...