如何将连续的行与它们之间不断增加的重叠结合起来(就像滚动 window)?
How to combine successive rows with an increasing overlap between them (just like a rolling window)?
我目前正在开始学习 Pandas 并努力用它来完成一项任务。我想做的是通过组合两个连续的行并增加它们之间的重叠来增加存储在数据框中的数据。就像滚动一样window.
我相信这个问题可以用这个小数据框来举例说明:
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
就好像我们在每对初始数据帧之间使用多重滚动 windows。请注意,我没有使用这个特定的数据框(这些值并不是真正按照 1,2,3,4...排序的)。我使用的是从 csv 导入的通用数据框。
这可能吗?提前致谢!
编辑
感谢大家的回复。 anky 和 Shubham Sharma 给出的两个答案都很完美。以下是将它们与我的真实数据框一起使用获得的结果:
初始数据帧
根据我的问题需要添加多次滚动后windows
您可以使用 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))
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
让我们尝试 rolling
和 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)
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
我目前正在开始学习 Pandas 并努力用它来完成一项任务。我想做的是通过组合两个连续的行并增加它们之间的重叠来增加存储在数据框中的数据。就像滚动一样window.
我相信这个问题可以用这个小数据框来举例说明:
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
就好像我们在每对初始数据帧之间使用多重滚动 windows。请注意,我没有使用这个特定的数据框(这些值并不是真正按照 1,2,3,4...排序的)。我使用的是从 csv 导入的通用数据框。
这可能吗?提前致谢!
编辑
感谢大家的回复。 anky 和 Shubham Sharma 给出的两个答案都很完美。以下是将它们与我的真实数据框一起使用获得的结果:
初始数据帧
根据我的问题需要添加多次滚动后windows
您可以使用 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))
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
让我们尝试 rolling
和 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)
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