我有这样的数据声望:
df = pd.DataFrame({"a": [1,2,3], "b": [4,5,6], "c": [7,8,9]})
a | b | c
1 | 4 | 7
2 | 5 | 8
3 | 6 | 9
我想得到一个像这样的人:
a | b | c
[1,2] | [4,5] | [7,8]
[2,3] | [5,6] | [8,9]
因此,我尝试了最明显的方法:不幸的是,df.rolling(2).apply(lambda values: np.array(values))
不能像rolling().apply
那样工作,它严格要求标量(浮点数)作为返回类型。
所以我在玩弄理解。
window = 2
df = pd.DataFrame({"a": [1,2,3], "b": [4,5,6], "c": [7,8,9]})
df = pd.DataFrame({column:[df[column].iloc[i-window:i].values for i in range(window, len(df)+1)] for column in df})
这是正确的,但看起来很丑,而且速度很慢。此外,它还会松开曾经是日期(现在是int)的索引类型。有没有更好,更清洁的方法?
答案 0 :(得分:1)
一种解决方案是在数据框的列值之间使用zip
:
df.apply(lambda x: list(zip(x[:-1:], x[1::])),
raw=True).apply(lambda x: list(map(list, x))
).apply(pd.Series).T
a b c
0 [1, 2] [4, 5] [7, 8]
1 [2, 3] [5, 6] [8, 9]