У меня есть pandas DataFrame, который, например, выглядит следующим образом.
df
Values
Timestamp
2020-02-01 A
2020-02-02 B
2020-02-03 C
Я хотел бы (чтобы упростить обработку, которая будет выполнена позже), чтобы сохранить окно из строки n и продублировать его для каждая отметка времени и создание индекса 2-го уровня с локальным индексом int.
При n = 2 это даст:
df_new
Values
Timestamp 2nd_level_index
2020-02-01 0 NaN
1 A
2020-02-02 0 A
1 B
2020-03-03 0 B
1 C
Существует ли какая-либо встроенная функция pandas что поможет мне сделать это? Скользящее окно с фиксированным размером (n) кажется началом, но тогда как мне продублировать окно и сохранить его для каждой строки, используя индекс 2-го уровня?
Заранее спасибо за любую помощь! Bests,
РЕДАКТИРОВАТЬ 04/05
Взяв предложенный код и немного изменив выходной формат, я адаптировал его для DataFrame с двумя столбцами.
Я получил следующий код:
import pandas as pd
import numpy as np
from random import seed, randint
def transpose_n_rows(df: pd.DataFrame, n_rows: int) -> pd.DataFrame:
array = np.concatenate((np.full((len(df.columns),n_rows-1), np.nan), df.transpose()), axis=1)
shape = array.shape[:-1] + (array.shape[-1] - n_rows + 1, n_rows)
strides = array.strides + (array.strides[-1],)
array = np.lib.stride_tricks.as_strided(array, shape=shape, strides=strides)
midx = pd.MultiIndex.from_product([df.columns, range(n_rows)], names=['Data','Position'])
transposed = pd.DataFrame(np.concatenate(array, axis=1), index=df.index, columns=midx)
return transposed
n = 4
start = '2020-01-01 00:00+00:00'
end = '2020-01-01 12:00+00:00'
pr2h = pd.period_range(start=start, end=end, freq='2h')
seed(1)
values1 = [randint(0,10) for ts in pr2h]
values2 = [randint(20,30) for ts in pr2h]
df2h = pd.DataFrame({'Values1' : values1, 'Values2': values2}, index=pr2h)
df2h_new = transpose_n_rows(df2h, n)
, который дает.
In [29]:df2h
Out[29]:
Values1 Values2
2020-01-01 00:00 2 27
2020-01-01 02:00 9 30
2020-01-01 04:00 1 26
2020-01-01 06:00 4 23
2020-01-01 08:00 1 21
2020-01-01 10:00 7 27
2020-01-01 12:00 7 20
In [30]:df2h_new
Out[30]:
Data Values1 Values2
Position 0 1 2 3 0 1 2 3
2020-01-01 00:00 NaN NaN NaN 2.0 NaN NaN NaN 27.0
2020-01-01 02:00 NaN NaN 2.0 9.0 NaN NaN 27.0 30.0
2020-01-01 04:00 NaN 2.0 9.0 1.0 NaN 27.0 30.0 26.0
2020-01-01 06:00 2.0 9.0 1.0 4.0 27.0 30.0 26.0 23.0
2020-01-01 08:00 9.0 1.0 4.0 1.0 30.0 26.0 23.0 21.0
2020-01-01 10:00 1.0 4.0 1.0 7.0 26.0 23.0 21.0 27.0
2020-01-01 12:00 4.0 1.0 7.0 7.0 23.0 21.0 27.0 20.0
Однако я вызываю эту функцию transpose_n_rows
в для l oop для значительного количество фреймов данных Это первое использование заставляет меня немного бояться проблем с производительностью.
Я мог бы прочитать, что следует избегать нескольких вызовов np.concatenate или pd.concat, и здесь у меня есть 2 из них для использования, которое может быть обойденным?
Пожалуйста, есть ли какой-нибудь совет избавиться от них, если это возможно?
Заранее благодарю за любую помощь! Bests,