Этот вопрос связан с перепрограммированием или укомплектованием персоналом. Я пытаюсь назначить различные рабочие места отдельным лицам (сотрудникам). Используя ниже df
,
'[Person]' = Individuals (employees)
'[Area]' and '[Place]' = unique jobs
'[On]' = How many unique jobs are occurring at each point in time
Таким образом, [Area]
и [Place]
вместе будут составлять unique
значения, которые являются разными заданиями. Эти значения будут присваиваться лицам с общей целью использовать наименьшее количество людей. Самые уникальные значения, assigned
любому одному человеку, равны 3. [On]
Отображает количество текущих unique
значений для [Place]
и [Area]
. Таким образом, это дает конкретное руководство о том, сколько человек мне нужно. Например,
1-3 unique values occurring = 1 individual
4-6 unique values occurring = 2 individuals
7-9 unique values occurring = 3 individuals etc
Вопрос: Если количество unique
значений в [Area]
и [Place]
больше 3, это вызывает у меня проблемы. Я не могу сделать groupby
где я assign
первые 3 unique values
individual 1
и следующим 3 unique
значениям для individual 2
и т.д. Я хочу группировать уникальные значения в [Area]
и [Place]
на [Area]
. Поэтому обратите внимание, чтобы assign
одинаковые значения в [Area]
отдельному лицу (до 3). Затем, если есть оставшиеся значения (<3), их следует объединить, чтобы сделать группу из 3, где это возможно.
То, как я предполагаю эту работу, - это смотреть в будущее на hour
. Для каждой новой row
значений script
должен видеть, сколько значений будет [On]
(Это указывает на то, сколько всего людей требуется). Если unique
значения> 3, они должны быть assigned
путем grouping
того же значения в [Area]
. Если есть оставшиеся значения, они должны быть объединены так или иначе, чтобы составить группу из 3.
Поэтапный процесс:
1) Используйте Column
[On]
Чтобы определить, сколько человек требуется, заглядывая в будущее на hour
2) При наличии более трех unique
значений сначала присваивайте одинаковые значения в [Area]
.
3) Если есть какие-либо остаточные значения, тогда попытайтесь объединить все возможное.
Ниже для df
существует 9 unique
значений для [Place]
и [Area]
с hour
. Таким образом, мы должны assigned
3 человека. Когда unique
значения> 3, он должен быть назначен [Area]
и видеть, происходит ли такое же значение. Остальные значения должны быть объединены с другими лицами, которые имеют менее 3 unique
значений.
import pandas as pd
import numpy as np
d = ({
'Time' : ['8:03:00','8:17:00','8:20:00','8:28:00','8:35:00','08:40:00','08:42:00','08:45:00','08:50:00'],
'Place' : ['House 1','House 2','House 3','House 4','House 5','House 1','House 2','House 3','House 2'],
'Area' : ['A','B','C','D','E','D','E','F','G'],
'On' : ['1','2','3','4','5','6','7','8','9'],
'Person' : ['Person 1','Person 2','Person 3','Person 4','Person 5','Person 4','Person 5','Person 6','Person 7'],
})
df = pd.DataFrame(data=d)
Это моя попытка:
def reduce_df(df):
values = df['Area'] + df['Place']
df1 = df.loc[~values.duplicated(),:] # ignore duplicate values for this part..
person_count = df1.groupby('Person')['Person'].agg('count')
leftover_count = person_count[person_count < 3] # the 'leftovers'
# try merging pairs together
nleft = leftover_count.shape[0]
to_try = np.arange(nleft - 1)
to_merge = (leftover_count.values[to_try] +
leftover_count.values[to_try + 1]) <= 3
to_merge[1:] = to_merge[1:] & ~to_merge[:-1]
to_merge = to_try[to_merge]
merge_dict = dict(zip(leftover_count.index.values[to_merge+1],
leftover_count.index.values[to_merge]))
def change_person(p):
if p in merge_dict.keys():
return merge_dict[p]
return p
reduced_df = df.copy()
# update df with the merges you found
reduced_df['Person'] = reduced_df['Person'].apply(change_person)
return reduced_df
df1 = (reduce_df(reduce_df(df)))
Это результат:
Time Place Area On Person
0 8:03:00 House 1 A 1 Person 1
1 8:17:00 House 2 B 2 Person 1
2 8:20:00 House 3 C 3 Person 1
3 8:28:00 House 4 D 4 Person 4
4 8:35:00 House 5 E 5 Person 5
5 8:40:00 House 1 D 6 Person 4
6 8:42:00 House 2 E 7 Person 5
7 8:45:00 House 3 F 8 Person 5
8 8:50:00 House 2 G 9 Person 7
Это мой намеченный результат:
Time Place Area On Person
0 8:03:00 House 1 A 1 Person 1
1 8:17:00 House 2 B 2 Person 1
2 8:20:00 House 3 C 3 Person 1
3 8:28:00 House 4 D 4 Person 2
4 8:35:00 House 5 E 5 Person 3
5 8:40:00 House 6 D 6 Person 2
6 8:42:00 House 2 E 7 Person 3
7 8:45:00 House 3 F 8 Person 2
8 8:50:00 House 2 G 9 Person 3
Описание того, как я хочу получить этот результат:
Index 0: One 'unique' value occurring. So 'assign' to individual 1
Index 1: Two 'unique' values occurring. So 'assign' to individual 1
Index 2: Three 'unique' values occurring. So 'assign' to individual 1
Index 3: Four 'unique' values on. So 'assign' to individual 2
Index 4: Five 'unique' values on. This one is a bit tricky and hard to conceptualise. But there is another 'E' within an 'hour'. So 'assign' to a new individual so it can be combined with the other 'E'
Index 5: Six 'unique' values on. Should be 'assigned' with the other 'D'. So individual 2
Index 6: Seven 'unique' values on. Should be 'assigned' with other 'E'. So individual 3
Index 7: Eight 'unique' values on. New value in '[Area]', which is a _leftover_. 'Assign' to either individual 2 or 3
Index 8: Nine 'unique' values on. New value in '[Area]', which is a _leftover_. 'Assign' to either individual 2 or 3
Пример №2:
d = ({
'Time' : ['8:03:00','8:17:00','8:20:00','8:28:00','8:35:00','8:40:00','8:42:00','8:45:00','8:50:00'],
'Place' : ['House 1','House 2','House 3','House 1','House 2','House 3','House 1','House 2','House 3'],
'Area' : ['X','X','X','X','X','X','X','X','X'],
'On' : ['1','2','3','3','3','3','3','3','3'],
'Person' : ['Person 1','Person 1','Person 1','Person 1','Person 1','Person 1','Person 1','Person 1','Person 1'],
})
df = pd.DataFrame(data=d)
Я получаю сообщение об ошибке:
IndexError: index 1 is out of bounds for axis 1 with size 1
На этой строке:
df.loc[:,'Person'] = df['Person'].unique()[assignedPeople]
Однако, если я изменяю Person на 1,2,3, повторяю, он возвращает следующее:
'Person' : ['Person 1','Person 2','Person 3','Person 1','Person 2','Person 3','Person 1','Person 2','Person 3'],
Time Place Area On Person
0 8:03:00 House 1 X 1 Person 1
1 8:17:00 House 2 X 2 Person 1
2 8:20:00 House 3 X 3 Person 1
3 8:28:00 House 1 X 3 Person 2
4 8:35:00 House 2 X 3 Person 2
5 8:40:00 House 3 X 3 Person 2
6 8:42:00 House 1 X 3 Person 3
7 8:45:00 House 2 X 3 Person 3
8 8:50:00 House 3 X 3 Person 3
Предполагаемый результат:
Time Place Area On Person
0 8:03:00 House 1 X 1 Person 1
1 8:17:00 House 2 X 2 Person 1
2 8:20:00 House 3 X 3 Person 1
3 8:28:00 House 1 X 3 Person 1
4 8:35:00 House 2 X 3 Person 1
5 8:40:00 House 3 X 3 Person 1
6 8:42:00 House 1 X 3 Person 1
7 8:45:00 House 2 X 3 Person 1
8 8:50:00 House 3 X 3 Person 1
Основной вынос из примера 2:
1) There are <3 unique values on so assign to individual 1