我的示例数据库如下:
A B C D
0 5 3 2 1
1 3 3 4 5
2 6 2 7 8
3 4 2 4 0
4 6 2 4 3
我想创建一个滚动窗口,并为每一行计算两列或更多列的总和。例如,回顾 4 和 min_periods
的 rolling()
参数设置为 3(即,如果有最少 3 行信息,则仅计算 sumproduct 值),我想计算列的 sumproduct A
和 C
,以及 A
和 B
平方(即 A
、B
、B
):>
A B C D A&C A&B&B
0 5 3 2 1 NaN NaN
1 3 3 4 5 NaN NaN
2 6 2 7 8 64 96
3 4 2 4 0 80 112
4 6 2 4 3 94 91
我知道使用 rolling().agg()
计算列式总和/乘积很简单:
df.rolling(4, min_periods=3).agg(np.sum)
df.rolling(4, min_periods=3).agg(np.product)
但我没有弄清楚如何在不同的列中应用相同的聚合逻辑。
请注意,我的原始数据框非常大(3k 行,500 列),因此我希望尽可能避免使用循环。
答案 0 :(得分:0)
嗯,实际上并没有那么难,我设法用非常简单的语法解决了它。我将这个问题和我的答案放在一起,因为这个主题中的问题并不多,希望它在未来也能帮助到其他人。
我们可以只取我们感兴趣的列,将它们水平逐个元素相乘,然后对乘法结果应用滚动总和:
df[['A','C']].product(axis=1).rolling(4, min_periods=3).sum()
df[['A','B','B']].product(axis=1).rolling(4, min_periods=3).sum()
这些将产生:
0 NaN
1 NaN
2 64.0
3 80.0
4 94.0
和
0 NaN
1 NaN
2 96.0
3 112.0
4 91.0
分别是所需的输出。