Дубликаты оптимизации Python / Pandas / Pulp

Я пытаюсь оптимизировать группировку / выбор участников пробной версии с ограниченным пространством, и у меня возникают некоторые проблемы. У меня есть кадры данных pandas, готовые к оптимизации, и я могу без проблем запустить линейную оптимизацию, за исключением одного ограничения, которое мне нужно добавить. Я пытаюсь использовать двоичные файлы для выбора (но я не привязан к этому по какой-либо причине, поэтому, если другой метод решит эту проблему, я могу переключиться) из большого списка. Мне нужно минимизировать общее время испытаний для выбора в следующем раунде испытаний, но некоторые субъекты уже провели несколько испытаний из-за характера эксперимента. Я хотел бы выбрать лучшую комбинацию предметов на основе минимизации времени, но разрешить некоторым предметам быть в списке несколько раз для оптимизации (так что мне не нужно вручную удалять их заранее). Например:

Name         Trial    ID       Time (ms)    Selected?
Mary Smith   A        11001    33           1
John Doe     A        11002    24           0
James Smith  B        11003    52           0
Stacey Doe   A        11004    21           1
John Doe     B        11002    19           1

Есть ли способ разрешить 2 записи Джона Доу для оптимизации, но ограничить вывод только одним его выбором? Спасибо за ваше время!


person rendermonster    schedule 25.06.2018    source источник
comment
Вам не нужно удалять их «вручную». Вы можете просто df.sort_values(['Name', 'Time (ms)']).drop_duplicates('Name'), и у вас останется самое короткое время для каждого человека.   -  person ALollz    schedule 26.06.2018
comment
Правильно, извините, я должен был это пояснить. Из-за характера испытаний и набора данных мне нужно было бы записывать удаление каждого испытания, поэтому, даже если я мог бы сбросить плохие оценки, мне пришлось бы сделать запись об этом вручную, что было бы чрезвычайно кропотливый. Так что я думаю, что я в основном привязан к этому формату.   -  person rendermonster    schedule 26.06.2018
comment
Вот как я бы сделал это в pulp: Используя pandas, я бы идентифицировал каждую повторяющуюся тему (Джо Доу). Для каждой такой темы вам нужно добавить одну (двоичную) переменную 0/1. Наконец, добавьте SOS (специально упорядоченный набор) этих переменных, по одному ограничению на повторяющуюся тему. y_JD1 + y_JD2 <= 1, чтобы на выходе было не больше одной темы.   -  person Ram Narasimhan    schedule 02.07.2018


Ответы (1)


Если у вас есть требование записать все значения, которые вы хотите удалить, вы можете использовать функцию duplicated, например

# First sort your dataframe
df.sort_values(['Name', 'Time (ms)'], inplace=True)

# Make a new column of duplicated values based only on name
df['duplicated'] = df.duplicated(subset=['Name'])

# You can then access the duplicates, but still have a log of the rejects
df.query('not duplicated')
#           Name Trial     ID  Time (ms)  Selected?  duplicated
# 2  James Smith     B  11003         52          0       False
# 1     John Doe     A  11002         24          0       False
# 0   Mary Smith     A  11001         33          1       False
# 3   Stacey Doe     A  11004         21          1       False

df.query('duplicated')
#        Name Trial     ID  Time (ms)  Selected?  duplicated
# 4  John Doe     B  11002         19          1        True
person John Karasinski    schedule 25.06.2018