Построение набора данных на основе данных столбца - PullRequest
0 голосов
/ 24 октября 2019

У меня есть набор данных, который выглядит следующим образом:

ID        I_Code  Date_2     Date_1     c_b Count
FT-56832    2   01/09/2019  02/08/2019  1000 6  
FT-93828    1   01/09/2019  03/08/2019  44  31
FT-13853    2   02/09/2019  03/08/2019  79  31
FT-18858    3   02/09/2019  04/08/2019  30  47
FT-56832    2   01/09/2019  04/08/2019  35  47
FT-19010    2   03/09/2019  04/08/2019  53  47
FT-62064    5   02/09/2019  04/08/2019  79  47
FT-94494    4   03/09/2019  04/08/2019  96  47
FT-73594    2   03/09/2019  04/08/2019  89  47
FT-78590    1   01/09/2019  05/08/2019  66  30
FT-14296    4   01/09/2019  05/08/2019  20  30
FT-82529    3   03/09/2019  05/08/2019  95  30
FT-33266    3   04/09/2019  05/08/2019  80  30
FT-62064    5   02/09/2019  05/08/2019  80  30
FT-94494    4   03/09/2019  05/08/2019  97  30

Я хочу расширить набор данных таким образом, чтобы общее количество записей в наборе данных соответствовало столбцу count, например для (Date_1, Date_2, ID, I_Code) есть счетчик, который представляет количество строк, например, первая строка должна быть расширена до 31 записи, где нам нужно создать еще один столбец c_b1, а сумма для c_b1 должна быть равна c_b, т.е. 34 в случае примера.

Благодаря @ jezrael,

я смог случайным образом разделить его, используя следующий код:

from numpy.random import multinomial 
def func(x): 
N = np.random.randint(5, 10, size=1)[0] 
print (N) 
return multinomial(x, [1./N] * N) 


a = df.join(pd.concat({k: pd.Series(func(v)) for k, v in df['value'].items()}).reset_index(level=1, drop=True).rename('A')) 
print (a) 

, где функция v генерировала счет. Теперь у меня уже есть счетчик и пытается использовать это:

a = df.join(pd.concat({k: pd.Series(df['count']) for k, v in df['value'].items()}).reset_index(level=1, drop=True).rename('A')) 
    print (a) 

, но это не обеспечивает вывод.

Пример ожидаемого результата:

Ожидаемый ввод:

ID          I_code  date_1      date_2     value count 
FT-56832    2       01/09/2019  02/08/2019 1000  6

Ожидаемый результат:

 ID          I_code     date_1      date_2      c_b1   c_b
    FT-56832    2         1/09/2019    2/08/2019     155    1000
    FT-56832    2         1/09/2019    2/08/2019     170    1000
    FT-56832    2         1/09/2019    2/08/2019     165    1000
    FT-56832    2         1/09/2019    2/08/2019     174    1000
    FT-56832    2         1/09/2019    2/08/2019     175    1000
    FT-56832    2         1/09/2019    2/08/2019     161    1000

Обратите внимание, что нет ограничений на распределение c_b1, его можно рандомизировать.

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

Спасибо

1 Ответ

0 голосов
/ 24 октября 2019

IIUC, Попробуйте это:

def f(x):
    i = np.random.random(len(x))
    j = i/sum(i) * x
    return j

df1 = df.reindex(df.index.repeat(df['count']))
df1['value'] = df1.groupby('ID')['value'].transform(f)
print(df1)

Ввод:

ID          I_code  date_1      date_2     value count 
FT-56832    2       01/09/2019  02/08/2019 1000  6
FT-56831    3       01/09/2019  02/08/2019 500   4

Выход:

         ID  I_code      date_1      date_2       value  count
0  FT-56832       2  01/09/2019  02/08/2019   94.921398      6
0  FT-56832       2  01/09/2019  02/08/2019  317.340230      6
0  FT-56832       2  01/09/2019  02/08/2019  289.495352      6
0  FT-56832       2  01/09/2019  02/08/2019  135.989723      6
0  FT-56832       2  01/09/2019  02/08/2019  146.207420      6
0  FT-56832       2  01/09/2019  02/08/2019   16.045878      6
1  FT-56831       3  01/09/2019  02/08/2019  125.931392      4
1  FT-56831       3  01/09/2019  02/08/2019  147.763965      4
1  FT-56831       3  01/09/2019  02/08/2019  158.801276      4
1  FT-56831       3  01/09/2019  02/08/2019   67.503367      4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...