Разверните фрейм данных на основе значения столбца и создайте новый столбец. - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть датафрейм 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

Я хочу выполнить двухкратный процесс.

  1. Разверните набор данных на основе a_count
  2. Разделите вес на записи 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% от количества.

Может кто-нибудь помочь с тем же.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...