Преобразование каждых n строк серии pandas в n столбцов фрейма данных

#python #pandas

Вопрос:

Я пытаюсь преобразовать серию панд, как:

Дата Ценность
2020-01-01 -1175
2020-01-02 -475
2020-01-03 1945
2020-01-06 -1295
2020-01-07 -835
2020-01-08 -785
2020-01-09 895
2020-01-10 -665

в фрейм данных панд, такой как:

Дата 0 1 2 3 4
2020-01-01 -1175 -475 1945 -1295 -665
2020-01-02 -475 1945 -1295 -835 -785
2020-01-03 1945 -1295 -835 -785 895
2020-01-06 -1295 -835 -785 895 -665

Каждые 5 (или n) строк ряда образуют одну строку в кадре данных.

Пример данных вместе с моим текущим (уродливым, но рабочим) кодом выглядит следующим образом:

 import pandas as pd
srs = pd.Series(index=pd.DatetimeIndex(pd.date_range(start="2020-01-01",end="2020-1-10",freq="B")), 
                data=[-1175,-475,1945,-1295,-835,-785,895,-665])
n = 5
df = pd.concat({i: srs.shift(-i) for i in range(n)}, axis=1).dropna()
df = df[range(n)]
df.index = df.index.droplevel(level=0)
 

Мне было интересно, есть ли лучший/аккуратный/приятный способ сделать это?

Комментарии:

1. pd.concat([s.shift(-n) for n in range(5)],axis=1).iloc[:4]

Ответ №1:

Попробуйте с sliding_window_view помощью from numpy :

 n = 5
v = np.lib.stride_tricks.sliding_window_view(srs.values, n)
df = pd.DataFrame(v, index=srs.index[:v.shape[0]])
 

df :

                0     1     2     3    4
2020-01-01 -1175  -475  1945 -1295 -835
2020-01-02  -475  1945 -1295  -835 -785
2020-01-03  1945 -1295  -835  -785  895
2020-01-06 -1295  -835  -785   895 -665
 

Полный Рабочий Пример:

 import numpy as np
import pandas as pd

srs = pd.Series(index=pd.DatetimeIndex(
    pd.date_range(start="2020-01-01", end="2020-1-10", freq="B")
), data=[-1175, -475, 1945, -1295, -835, -785, 895, -665])

n = 5
v = np.lib.stride_tricks.sliding_window_view(srs.values, n)
df = pd.DataFrame(v, index=srs.index[:v.shape[0]])

print(df)
 

Комментарии:

1. Очень круто! Я совершенно не подозревал о его существовании! Спасибо!

2. Да. Это хорошая идея. И очень полезно в этом случае.