Пользовательская функция + групповые панды с различными условиями на сгруппированные по переменным - PullRequest
0 голосов
/ 29 августа 2018

Я хочу сгенерировать весовые коэффициенты с помощью группирования для данных, которые изначально выглядят так:

V1   V2   MONTH  CHOICES  PRIORITY
X    T1   M1     C1       1
X    T1   M1     C2       0
X    T1   M1     C3       0
X    T2   M1     C1       1
X    T2   M1     C5       0
X    T2   M1     C6       0
X    T2   M1     C2       1
X    T1   M2     C1       1
X    T1   M2     C2       0
X    T1   M2     C3       0
X    T2   M2     C1       0
X    T2   M2     C5       1
X    T2   M2     C6       0
X    T2   M2     C2       1

По сути, когда MONTH отличается от M1, я хочу иметь отмеченные варианты выбора с весами, равными удвоенному значению любого не отмеченного значения.
Пример: если у вас есть (C1, C2, C3) и C1 помечен только один, веса будут: 0,5 / 0,25 / 0,25.

В то же время, в течение первого месяца, я хочу, чтобы веса были сосредоточены исключительно на отмеченных вариантах. Предыдущий пример станет (1/0/0).

Точность о данных:
Для данного кортежа (V1, V2, MONTH) у нас может быть не более двух вариантов, помеченных как приоритетные (вообще нет приоритета).

Вот что я пробовал:

def weights_preferences(data):
     if (data.MONTH.values != 'M1'):
         data['WEIGHTS'] = 1/(len(data)+data[data.PRIORITY==1].shape[0])
         data['WEIGHTS'] = data.apply(lambda x : 2*x.WEIGHTS if x.PRIORITY==1 else x.WEIGHTS, axis=1)
     elif data.MONTH.values == 'M1' & data[data.PRIORITY==1].shape[0]==0 :
         data['WEIGHTS'] = 1/(len(data))
     else :
         if data[data.PREFERENCE==1].shape[0]==1 :
             data['WEIGHTS'] = [1 if x[1].PRIORITY==1 else 0 for x in data.iterrows()]
         else :
             data['WEIGHTS'] = [0.5 if x[1].PRIORITY==1 else 0 for x in data.iterrows()]
     return data

tmp = tmp.groupby(['V1','V2','MONTH']).apply(weights_preferences)

Проблема в том, что, поскольку я группирую по «МЕСЯЦ», кажется, что значение больше не появляется в данных, к которым применяется «weights_preferences».

P.S .: Вывод будет выглядеть так

V1   V2   MONTH  CHOICES  PRIORITY  WEIGHTS
X    T1   M1     C1       1         1
X    T1   M1     C2       0         0
X    T1   M1     C3       0         0
X    T2   M1     C1       1         0.5
X    T2   M1     C5       0         0
X    T2   M1     C6       0         0
X    T2   M1     C2       1         0.5
X    T1   M2     C1       1         0.5
X    T1   M2     C2       0         0.25
X    T1   M2     C3       0         0.25
X    T2   M2     C1       0         0.16
X    T2   M2     C5       1         0.33
X    T2   M2     C6       0         0.16
X    T2   M2     C2       1         0.33

Любые предложения приветствуются!

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...