如何将连续的行与它们之间越来越多的重叠结合起来(就像滚动窗口一样)?

Posted

技术标签:

【中文标题】如何将连续的行与它们之间越来越多的重叠结合起来(就像滚动窗口一样)?【英文标题】:How to combine successive rows with an increasing overlap between them (just like a rolling window)? 【发布时间】:2021-04-17 15:04:32 【问题描述】:

我目前开始学习 Pandas 并努力完成一项任务。我想要做的是通过组合两个连续的行以及它们之间越来越多的重叠来增加存储在数据框中的数据。就像一个滚动的窗户。

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

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 给出的两个答案都很完美。以下是将它们与我的真实数据框一起使用所获得的结果:

初始数据帧

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

【问题讨论】:

我在下面的回答解决了构建您要求的数据框的具体情况。如果问题是关于获取列表并变成跨步视图矩阵的更一般问题,那么@anky 的解决方案可能是一个更好的起点。在这种情况下,可能有一些 numpy 技巧可用于从基于列表理解的解决方案转移到基于操作数组的更快解决方案。 是的,我的问题是针对一般数据框的,很抱歉造成混淆。 Numpy 1.2 为此提供了滑动窗口功能:numpy.org/doc/1.20/reference/generated/… 【参考方案1】:

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

【讨论】:

感谢@GuillemB,但是数据框是从包含大量数据的 csv 导入的,并且值的顺序不像 1、2、3、4 ......就像我提供的小例子一样(对不起关于混乱),所以我相信这个答案不适用于更通用的数据框。我将更新问题以使其更清楚。【参考方案2】:

可能没那么优雅,但试试吧:

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

【讨论】:

谢谢@anky,我试过了,但因为n 没有定义,所以出现错误。代表列数吗? @JavierTG 我的错,我错过了添加该参数,编辑了答案。现在检查?是的,没有。列数 谢谢!工作完美:) 这个对另一个问题的回答有一个矢量化解决方案,它可能(或可能不)重要,具体取决于数据的大小。 ***.com/a/42258242/938530 @GuillemB 感谢您链接到答案。【参考方案3】:

让我们试试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

【讨论】:

感谢 Shubham Sharma,但我相信这个答案不适用于从 csv 导入的一般数据帧。正如 GuillemB 所评论的那样,我认为这是因为我在问题中提供了一个小例子(对混淆感到抱歉)。 @JavierTG general dataframe 是什么意思,你能详细说明一下吗? 我的错,这也很完美。对不起我之前的评论,我认为这个答案就像 GuillemB 提供的一样,再次感谢它!

以上是关于如何将连续的行与它们之间越来越多的重叠结合起来(就像滚动窗口一样)?的主要内容,如果未能解决你的问题,请参考以下文章

当 2 行与 Canvas 重叠时如何保持相同的颜色 alpha

Oracle SQL 选择具有开始和结束日期的行,如果某些重叠合并行

如何将数据框的行与组配对?

带 sf 的行与点之间的距离

将 B 列的行与已合并的行 A 的计数合并

QT tablewidget列名字对应的行与第0行之间的边框线未显示