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_view和transpose( T):
from numpy.lib.stride_tricks import sliding_window_view as swv\n\nout = pd.DataFrame(swv(df[\'col0\'], 5).T).add_prefix(\'col\')\nRun 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]\nRun Code Online (Sandbox Code Playgroud)\n可重现的输入:
\nN = 1000\ndf = pd.DataFrame({\'col0\': range(1, N+1)})\nRun Code Online (Sandbox Code Playgroud)\n100k 行的时间:
\n25 ms \xc2\xb1 402 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10 loops each)\nRun Code Online (Sandbox Code Playgroud)\n
您可以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)
| 归档时间: |
|
| 查看次数: |
359 次 |
| 最近记录: |