У меня есть df, как показано ниже
df = pd.DataFrame({'Session': ['s1', 's1', 's1', 's1', 's1', 's1', 's1',
's1', 's1', 's1', 's1', 's1', 's1', 's1', 's1'],
'slot_num': [1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9]})
df:
Session slot_num
s1 1
s1 2
s1 3
s1 3
s1 4
s1 4
s1 5
s1 5
s1 6
s1 7
s1 7
s1 8
s1 8
s1 9
s1 9
Из приведенного выше я хотел бы создать столбец с именем service_time случайным образом со средним точно 20, максимум 25 и минимум 2. как можно быстрее.
Я пробовал приведенный ниже код, но он не дает точного среднего значения 20.
Примечание. Время обслуживания должно содержать только целые числа
# generate service time with mean = 20, min = 2 and max = 25
def gen_avg(n, expected_avg=20, a=2, b=25):
l = np.random.randint(a, b, size=n)
while True:
if np.mean(l) == expected_avg:
break
while np.mean(l) > expected_avg:
c = np.random.choice(np.where(l>expected_avg)[0])
l[c] = np.random.randint(a, expected_avg+1)
while np.mean(l) < expected_avg:
c = np.random.choice(np.where(l<expected_avg)[0])
l[c] = np.random.randint(expected_avg, b)
return l
df['service_time'] = df.groupby('Session')['Session'].transform(lambda x: gen_avg(len(x)))
Я тоже пробовал и ниже, но это занимает очень много времени
#https://stackoverflow.com/a/39435600/2901002
def gen_avg(n, expected_avg=20, a=5, b=25):
while True:
l = np.random.randint(a, b, size=n)
avg = np.mean(l)
if avg == expected_avg:
return l
df['service_time'] = df.groupby('Session')['Session'].transform(lambda x: gen_avg(len(x)))