如何在 Python 中将滚动子序列生成到数据框中

nti*_*tel 10 python dataframe pandas

我有以下数据框:

列0
1
2
3
4
5
...
1000

我想将 col0 滚动到窗口大小为 5 的数据框中,所以结果将是这样的:

列0 第 1 列 列2 ... 995号
1 2 3 ... 996
2 3 4 ... 997
3 4 5 ... 998
4 5 6 ... 999
5 6 7 ... 1000

我尝试过使用循环和“iloc”,这会产生正确的结果,但随着原始数据帧变得更长,需要很长时间才能完成。要完成 10,000 个,大约需要 2 分钟,20,000 个几乎需要 10 分钟,依此类推……有没有办法在 Python 中更快、更高效地完成它?

moz*_*way 15

使用numpy.lib.stride_tricks.sliding_window_viewtranspose( T):

\n
from numpy.lib.stride_tricks import sliding_window_view as swv\n\nout = pd.DataFrame(swv(df[\'col0\'], 5).T).add_prefix(\'col\')\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
   col0  col1  col2  col3  col4  col5  col6  col7  col8  col9  ...  col986  \\\n0     1     2     3     4     5     6     7     8     9    10  ...     987   \n1     2     3     4     5     6     7     8     9    10    11  ...     988   \n2     3     4     5     6     7     8     9    10    11    12  ...     989   \n3     4     5     6     7     8     9    10    11    12    13  ...     990   \n4     5     6     7     8     9    10    11    12    13    14  ...     991   \n\n   col987  col988  col989  col990  col991  col992  col993  col994  col995  \n0     988     989     990     991     992     993     994     995     996  \n1     989     990     991     992     993     994     995     996     997  \n2     990     991     992     993     994     995     996     997     998  \n3     991     992     993     994     995     996     997     998     999  \n4     992     993     994     995     996     997     998     999    1000  \n\n[5 rows x 996 columns]\n
Run Code Online (Sandbox Code Playgroud)\n

可重现的输入:

\n
N = 1000\ndf = pd.DataFrame({\'col0\': range(1, N+1)})\n
Run Code Online (Sandbox Code Playgroud)\n

100k 行的时间:

\n
25 ms \xc2\xb1 402 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n


our*_*os1 5

您可以sliding_window_view为此使用:

import pandas as pd
from numpy.lib.stride_tricks import sliding_window_view

df = pd.DataFrame({'Col0': range(1,1001)})

data = sliding_window_view(df['Col0'], 5).T

df_new = pd.DataFrame(data, 
                      columns=[f'Col{i}' for i in range(data.shape[1])])

print(df_new)

   Col0  Col1  Col2  Col3  Col4  ...  Col991  Col992  Col993  Col994  Col995
0     1     2     3     4     5  ...     992     993     994     995     996
1     2     3     4     5     6  ...     993     994     995     996     997
2     3     4     5     6     7  ...     994     995     996     997     998
3     4     5     6     7     8  ...     995     996     997     998     999
4     5     6     7     8     9  ...     996     997     998     999    1000

[5 rows x 996 columns]
Run Code Online (Sandbox Code Playgroud)