大熊猫交错零的数据帧

时间:2017-02-27 16:32:40

标签: python pandas numpy

我正在构建一个蒙特卡洛模型,并且需要模拟我每个月捕获的新项目数量。每个月我都会添加一个具有已知均值和stdev的随机数量的项目。

months = ['2017-03','2017-04','2017-05']
new = np.random.normal(4,3,size = len(months)).round()
print new

[ 1.  5.  4.]

df_new = pd.DataFrame(zip(months,new),columns = ['Period','newPats'])
print df_new

    Period  newPats
0  2017-03      1.0
1  2017-04      5.0
2  2017-05      4.0

我需要将其转换为项目x月数据框,其中值为零直到给定项目开始的月份。

这是我的形状:

df_full = pd.DataFrame(np.ones((new.sum(), len(months))),columns = months)

   2017-03  2017-04  2017-05
0      1.0      1.0      1.0
1      1.0      1.0      1.0
2      1.0      1.0      1.0
3      1.0      1.0      1.0
4      1.0      1.0      1.0
5      1.0      1.0      1.0
6      1.0      1.0      1.0
7      1.0      1.0      1.0
8      1.0      1.0      1.0
9      1.0      1.0      1.0

这是我需要的输出:

#perform transformation
print df_out

   2017-03  2017-04  2017-05
0        1        1        1
1        0        1        1
2        0        1        1
3        0        1        1
4        0        1        1
5        0        1        1
6        0        0        1
7        0        0        1
8        0        0        1
9        0        0        1

规则是在2017-03中添加了1个项目,因此第一个记录的所有期间= 1。接下来的5个项目在2017-04中添加,因此所有之前的期间= 0.最后4个项目在2017-05中添加,因此它们在上个月仅为= 1。这将进入一个蒙特卡罗模拟,它将运行数千次,所以我无法手动迭代列/行 - 任何有关如何处理的矢量化建议?

1 个答案:

答案 0 :(得分:0)

打败你们。

df_out = pd.DataFrame([new[:x+1].sum() * [1] + (new.sum() - new[:x+1].sum() ) * [0] for x in range(len(months))]).transpose()
df_out.columns = months

print df_out



2017-03  2017-04  2017-05
0        1        1        1
1        0        1        1
2        0        1        1
3        0        1        1
4        0        1        1
5        0        1        1
6        0        0        1
7        0        0        1
8        0        0        1
9        0        0        1