У меня есть датафрейм df:
Date_1 Date_2 weight a_count
01/09/2019 02/08/2019 251 2
01/09/2019 02/08/2019 251 2
01/09/2019 10/08/2019 322 3
01/09/2019 10/08/2019 322 3
01/09/2019 10/08/2019 322 3
01/09/2019 12/08/2019 414 4
01/09/2019 12/08/2019 414 4
01/09/2019 12/08/2019 414 4
01/09/2019 12/08/2019 414 4
01/09/2019 14/08/2019 531 5
01/09/2019 14/08/2019 531 5
01/09/2019 14/08/2019 531 5
01/09/2019 14/08/2019 531 5
01/09/2019 14/08/2019 531 5
Я хочу выполнить двухкратный процесс.
- Разверните набор данных на основе a_count
- Разделите вес на записи a_count и создайте новый столбец weight_i. улов в том, что каждый weight_i должен быть больше 50.
Например, в 1-й строке будет 2 записи с суммой weight_i
, равной weight
столбец
Я попытался сделать то же самое, используя:
def f(x):
i = np.random.random(len(x))
j = i/sum(i) * x
return j
df2 = df1.reindex(df1.index.repeat(df1['a_count']))
df2['weight_i'] = df2.groupby(['Date_1','Date_2'])['weight'].transform(f)
Это на самом деле распределяет вес так, что weight_i, агрегированный для каждой записи, равен весу.
Я также хочу выполнить второе условие, то есть weight_i всегда должен быть больше 50.
В некоторых случаях невозможно, чтобы все записи были больше 50. Я думал сделать эти значения равными 0, используя:
df2['weight_i'].loc[df2['weight_i'] <= 49] = 0
Но присвоение им 0 не позволит мне сложить weight_i, равный весу для конкретной записи.
Я хочу получить weight_i больше 50, и если вес уже исчерпан, присвойте 0 записям, и эти записи (имеющие weight_i как 0) не должны превышать 30% от количества.
Может кто-нибудь помочь с тем же.
Спасибо