首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于列数据构造数据集

基于列数据构造数据集
EN

Stack Overflow用户
提问于 2019-10-24 18:26:25
回答 1查看 61关注 0票数 0

我有一个数据集,看起来如下:

代码语言:javascript
复制
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

我能够使用以下代码随机划分它:

代码语言:javascript
复制
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生成计数的位置。现在我已经有了计数,并尝试使用以下方法:

代码语言:javascript
复制
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) 

但这并不能提供产出。

预期产出实例:

预期输入:

代码语言:javascript
复制
ID          I_code  date_1      date_2     value count 
FT-56832    2       01/09/2019  02/08/2019 1000  6

预期输出:

代码语言:javascript
复制
 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的分布上没有对比,它可以随机化。

有人能帮上忙吗。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-10-24 19:59:54

IIUC,试试这个:

代码语言:javascript
复制
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)

输入:

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
         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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58547198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档