отбрасывание дубликатов Python в определенном порядке (не `first`,` last`) - PullRequest
0 голосов
/ 05 июня 2018
ID  values
111 reason1
111 reason2
111 reason3
222 reason2
222 reason4
222 reason5

df.drop_duplicates(["ID"], keep='???', inplace=True)

Я знаю, что я использую drop_duplicates, но он дает мне только опцию first, last.Я хочу проверить, что если есть причина2, то вести запись с указанием причины2, иначе проверить причину3 и т. Д. В основном, существует определенный порядок, например, причина2, причина3, причина4 и т. Д.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Использовать тип категории d с определенным порядком и сортировкой:

df['values'] = df['values'].astype('category', ordered=True)\
                           .cat.reorder_categories(['reason2',
                                                    'reason3',
                                                    'reason1',
                                                    'reason4',
                                                    'reason5'])

df.sort_values('values').drop_duplicates('ID', keep='first')

Вывод:

    ID   values
1  111  reason2
3  222  reason2
0 голосов
/ 06 июня 2018

На основании комментариев это может быть одна из реализаций: (Реализация идеи @ brittenb .)

priority_dict = {
    'reason1':1,
    'reason2':2,
    'reason3':3,
    'reason4':4,
    'reason5':5
}
df['priority'] = df['values'].map(priority_dict)
df = df.sort_values(by=['ID', 'priority'])
df.drop_duplicates(['ID'], keep='first')

Вывод:

     ID values  priority
0   111 reason1 1
3   222 reason2 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...