Я хотел бы дать каждому сотруднику пропорциональную долю после продажи. Поэтому сначала мне нужно суммировать количество контактов на одного клиента, которые привели к продаже, а затем разделить вознаграждение между каждым сотрудником, участвующим в этом процессе.
import pandas as pd
df = pd.DataFrame({"Cust_ID":[1,1,1,2,3,3], "Employee": ["A","B","B","C","B","A"], "Purchase":[0,0,1,1,0,1]})
df
Cust_ID Employee Purchase
0 1 A 0
1 1 B 0
2 1 B 1
3 2 C 1
4 3 B 0
5 3 A 1
Когда для финальной продажи требуется 3 (или более) шагов (Cust_ID = 1), вознаграждения распределяются в 50%, 30% и 20% (0%..). Для 2 шагов 70% и 30%. Один шаг = 100%
Результат должен выглядеть так:
Cust_ID Employee Purchase Reward
0 1 A 0 0.2
1 1 B 0 0.3
2 1 B 1 0.5
3 2 C 1 1.0
4 3 B 0 0.3
5 3 A 1 0.7
Я пытался использовать df["Reward"] = df.groupby("Cust_ID").Purchase.transform("xxx"), но распределенная награда не выполнялась..
Заранее спасибо!






Сначала давайте увеличим DataFrame:
df['Touch'] = df.groupby('Cust_ID').cumcount()
df['Touches'] = df.groupby('Cust_ID').Employee.count()[df.Cust_ID].values
df['Reward'] = 0.0
Теперь у нас есть базовая установка:
Cust_ID Employee Purchase Touch Touches Reward
0 1 A 0 0 3 0.0
1 1 B 0 1 3 0.0
2 1 B 1 2 3 0.0
3 2 C 1 0 1 0.0
4 3 B 0 0 2 0.0
5 3 A 1 1 2 0.0
Наконец, примените правила вознаграждения:
df.loc[df.Touches == 1, 'Reward'] = 1.0
df.loc[(df.Touches == 2) & (df.Touch == 0), 'Reward'] = 0.3
df.loc[(df.Touches == 2) & (df.Touch == 1), 'Reward'] = 0.7
df.loc[(df.Touches == 3) & (df.Touch == 0), 'Reward'] = 0.2
df.loc[(df.Touches == 3) & (df.Touch == 1), 'Reward'] = 0.3
df.loc[(df.Touches == 3) & (df.Touch == 2), 'Reward'] = 0.5
Эту последнюю часть можно было бы сделать более умно, используя np.select(). Это упражнение для читателя.