如何组合连续的行,并增加它们之间的重叠(就像滚动窗口)?

2024-09-29 21:48:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在开始学习熊猫,并努力用它完成一项任务。我试图做的是通过组合两个连续的行并增加它们之间的重叠来增加存储在数据帧中的数据。就像一扇滚动的窗户

我相信这个问题可以用这个小数据框来说明:

df = pd.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], columns=['A', 'B', 'C', 'D'])

其中:

    A   B   C   D
0   1   2   3   4
1   5   6   7   8
2   9   10  11  12

有了它,我想实现但不知道如何实现的是一个数据帧,如下一个:

    A   B   C   D
0   1   2   3   4
1   2   3   4   5
2   3   4   5   6
3   4   5   6   7
4   5   6   7   8
5   6   7   8   9
6   7   8   9   10
7   8   9   10  11
8   9   10  11  12

就像我们在每对初始数据帧之间使用多个滚动窗口一样。请注意,我没有使用这个特定的数据帧(这些值并不像1,2,3,4…)那样按顺序排列。我使用的是从csv导入的通用数据帧

这可能吗?提前谢谢


编辑

感谢所有的回复。anky和Shubham Sharma给出的两个答案都很完美。以下是在我的真实数据帧中使用这两种方法得到的结果:

初始数据帧enter image description here

根据我的问题需要添加多个滚动窗口后enter image description here


Tags: columnscsv数据方法答案编辑dataframedf
3条回答

可能没有那么优雅,但请尝试:

def fun(dataframe,n):
    l = dataframe.stack().tolist()
    return (pd.DataFrame([l[e:e+n] for e,i in enumerate(l)],
        columns=dataframe.columns).dropna().astype(dataframe.dtypes))

fun(df,df.shape[1])

   A   B   C   D
0  1   2   3   4
1  2   3   4   5
2  3   4   5   6
3  4   5   6   7
4  5   6   7   8
5  6   7   8   9
6  7   8   9  10
7  8   9  10  11
8  9  10  11  12

您可以使用numpy完成所有举重,然后将生成的矩阵放入数据帧中

import numpy as np
import pandas as pd

n_columns = 4
n_rows = 9

aux = np.tile(
    np.arange(1, n_columns+1),  # base row
    (n_rows, 1)  # replicate it as many times as needed
)

# use broadcasting to add a per row offset to each row
aux = aux + np.arange(n_rows)[:, np.newaxis]

# put everything into a dataframe
pd.DataFrame(aux)

让我们试试rollingnumpy

def rolling(a, w=4):
    s = a.strides[-1]
    return np.lib.stride_tricks.as_strided(a, (len(a)-w+1, w), (s, s))

pd.DataFrame(rolling(df.values.reshape(-1)), columns=df.columns)

   A   B   C   D
0  1   2   3   4
1  2   3   4   5
2  3   4   5   6
3  4   5   6   7
4  5   6   7   8
5  6   7   8   9
6  7   8   9  10
7  8   9  10  11
8  9  10  11  12

相关问题 更多 >

    热门问题