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

Python 如何组合连续的行,并增加它们之间的重叠(就像滚动窗口)?,python,pandas,data-augmentation,Python,Pandas,Data Augmentation,我现在开始学习熊猫,并努力用它完成一项任务。我试图做的是通过组合两个连续的行并增加它们之间的重叠来增加存储在数据帧中的数据。就像一扇滚动的窗户 我相信这个问题可以用这个小数据框来说明: 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

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

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

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给出的两个答案都很完美。以下是在我的真实数据帧中使用这两种方法得到的结果:

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

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

您可以使用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)

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

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))


让我们尝试使用
numpy
滚动

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)


谢谢@GuillemB,但是数据帧是从csv导入的,包含大量数据,并且值的顺序不是像1、2、3、4。。。正如我提供的小示例(很抱歉混淆了),因此我认为这个答案不适用于更一般的数据帧。我将更新问题以使其更清晰。谢谢@anky,我尝试了它,但我得到了一个错误,因为
n
未定义。它代表列数吗?@JavierTG my bad,我没有添加那个参数,编辑了答案。现在检查?是的,这是ColumnStanks的编号!完美工作:)这个对另一个问题的答案有一个矢量化的解决方案,它可能(也可能不)重要,这取决于数据的大小@GuillemB感谢您链接到答案。我下面的答案针对的是构建您所要求的数据框架的具体情况。如果问题是关于一个更一般的问题,即获取一个列表并将其转化为一个具有跨越式视角的矩阵,那么@anky的解决方案可能是一个更好的起点。在这种情况下,可能有一些numpy技巧可用于从基于列表理解的解决方案转移到基于操纵数组的更快的解决方案。是的,我的问题是关于一般数据帧,很抱歉混淆。numpy 1.2提供了一个滑动窗口函数,正是为了实现这一点:感谢Shubham Sharma,但我相信这个答案不适用于从csv导入的一般数据帧。正如GuillemB所评论的,我认为这是因为我在问题中提供了一个小例子(很抱歉混淆)。@JavierTG你所说的
general dataframe
是什么意思。很抱歉我之前的评论,我认为这个答案就像吉勒姆提供的答案一样,塔克斯再次为它!
   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