У меня есть df
, который содержит многочисленные Places
в повторяющиеся периоды времени.Эти Places
начинаются и заканчиваются случайным образом.Для каждого периода времени я хочу присвоить каждому уникальному месту значение Group
.Основные правила при этом:
1) Каждый Group
может содержать не более 3 уникальных Places
одновременно
2) Уникальный Places
должен быть равномерно распределен по каждому Group
Я взял очень маленький подраздел df
.Есть 7 уникальных значений (но не более 5 встречающихся одновременно) и 2 Groups
на выбор.Но на практике df
может содержать до 50 уникальных значений, которые заканчиваются и заканчиваются, а также различные периоды времени, которые будут распределены по максимуму в 6 групп.
Чтобы понять, сколько Places
в настоящее время я включил Total
, который основан на том, если Place
появится снова.
df
содержит все доступные Groups
для каждого уникального Place
для каждого Period
,Места Golf
и Club
будут закончены, но мы предполагаем, что все остальные места продолжаются, как они появляются позже в df
.
df = pd.DataFrame({
'Period' : [1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,6,6],
'Place' : ['CLUB','CLUB','CLUB','HOME','HOME','AWAY','AWAY','WORK','WORK','AWAY','AWAY','GOLF','GOLF','CLUB','CLUB','POOL','POOL','HOME','HOME','WORK','WORK','AWAY','AWAY','POOL','POOL','TENNIS','TENNIS'],
'Total' : [1,1,1,2,2,3,3,4,4,4,4,5,5,4,4,4,4,4,4,4,4,4,4,4,4,5,5],
'Available Group' : ['1','2','1','2','1','2','1','2','1','1','2','1','2','2','1','2','1','2','1','2','1','1','2','1','2','2','1'],
})
Основная проблема, которая вызывает у меня проблемы, - Places
появляются / существуют динамически.На этом они заканчиваются, а новые начинаются случайным образом.Таким образом, назначение и распределение текущего уникального Places
должно учитывать эту концепцию
Попытка:
def AssignPlace(df):
uniquePlaces = df['Place'].unique()
G3 = dict(zip(uniquePlaces, np.arange(len(uniquePlaces)) // 3 + 1))
df['Assigned Group'] = df['Place'].map(G3)
return df
df = df.groupby('Available Group', sort=False).apply(AssignPlace)
df = df.drop_duplicates(subset = ['Period','Place'])
Out:
Period Place Total Available Group Assigned Group
0 1 CLUB 1 1 1
1 2 CLUB 1 2 1
3 2 HOME 2 2 1
5 2 AWAY 3 2 1
7 3 WORK 4 2 2
9 3 AWAY 4 1 1
11 3 GOLF 5 1 2 #GOLF FINISHES SO 4 OCCURING FROM NEXT ROW
13 4 CLUB 4 2 1 #CLUB FINISHES BUT POOL STARTS SO STILL 4 OCCURING FROM NEXT ROW
15 4 POOL 4 2 2
17 4 HOME 4 2 1
19 5 WORK 4 2 2
21 5 AWAY 4 1 1
23 5 POOL 4 1 2
25 6 TENNIS 5 2 3 #Signifies issue
Последняя строка отображает начало проблемы.Назначенная группа правильно измеряет это место как седьмое уникальное значение, но она не учитывает текущих уникальных значений.По завершении Club
и Golf
они представляют собой только 5 текущих значений и 2 доступных группы.Но он возвращается Group 3
.Поэтому каждое новое уникальное значение будет продолжать учитываться, а не учитывать текущие уникальные значения.
Предполагаемый вывод, TENNIS
Назначенная группа теперь 1
вместо 3
:
Period Place Total Available Group Assigned Group
0 1 CLUB 1 1 1
1 2 CLUB 1 2 1
3 2 HOME 2 2 1
5 2 AWAY 3 2 1
7 3 WORK 4 2 2
9 3 AWAY 4 1 1
11 3 GOLF 5 1 2
13 4 CLUB 4 2 1
15 4 POOL 4 2 2
17 4 HOME 4 2 1
19 5 WORK 4 2 2
21 5 AWAY 4 1 1
23 5 POOL 4 1 2
25 6 TENNIS 5 2 1