Заполнение массива пересечением данных (фиксированный размер окна)
У меня есть числа от 1 до 30, я помещаю их в массив с фиксированной длиной =10 и вот что у меня изначально:
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
Мне нужно окно фиксированного размера =7, должно быть пересечение данных, чтобы у меня было 5 строк вместо 3 (1-10, 8-17, 15-24, 22-30, 29-30):
1 2 3 4 5 6 7 8 9 10
8 9 10 11 12 13 14 15 16 17
15 16 17 18 19 20 21 22 23 24
22 23 24 25 26 27 28 29 30 0
29 30 0 0 0 0 0 0 0 0
Я понятия не имею, как это реализовать... Может кто-нибудь, пожалуйста, помогите мне? Заранее спасибо!
1 ответ
Решение
Это метод, который приходит мне в голову
Newdf=pd.DataFrame(data=df.values.ravel(),index=np.arange(len(df.values.ravel()))//7)
n=10-7
s=Newdf.groupby(level=0)[0].apply(list).apply(pd.Series)
s
Out[824]:
0 1 2 3 4 5 6
0 1.0 2.0 3.0 4.0 5.0 6.0 7.0
1 8.0 9.0 10.0 11.0 12.0 13.0 14.0
2 15.0 16.0 17.0 18.0 19.0 20.0 21.0
3 22.0 23.0 24.0 25.0 26.0 27.0 28.0
4 29.0 30.0 NaN NaN NaN NaN NaN
pd.concat([s,s.iloc[:,:n].shift(-1)],1).fillna(0)
Out[832]:
0 1 2 3 4 5 6 0 1 2
0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
1 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0
2 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0
3 22.0 23.0 24.0 25.0 26.0 27.0 28.0 29.0 30.0 0.0
4 29.0 30.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0