基于列数据构造数据集

时间:2019-10-24 18:26:25

标签: python pandas numpy

我有一个类似的数据集:

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),有一个count,而count代表行数,就像第一行应该扩展到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 :(得分:0)

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